IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Sudoku, Génération de grille


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Sudoku, Génération de grille
    Bonjour,


    Je viens de créer un petit code tout simple pour générer un grille du sudoku (remplie). Malheureusement, lorsque je lance mon programme, il tourne indéfiniment en utilisant 50% du processeur.

    Je crois qu'il doit y avoir une boucle infinie mais je ne vois pas où.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
     
    using namespace std;
     
    int main(){
    int grille[9][9];//déclaration de la grille + mise à zéro
     
    for(int t=0;t<9;t++){
        for(int w=0;w<9;w++){
            grille[t][w] = 0;
        }
    }
     
    //Pour la génération des nombres aléatoires
    srand((unsigned int)time(NULL));
     
    //Les limites pour le tirage au sort
    int max = 9;
    int min = 1;
    bool nombre_ok;
     
    //Pour la sélection du nombre de la grille
     
    for(int i=0; i<9; i++){
    	for(int j=0; j<9; j++){
    	    //Début de vérification du nombre pour la ligne
    		do{
    			nombre_ok = true;
    			grille[i][j] = (rand() % (max - min + 1)) + min;
    			for(int k=0; k<9; k++){
    				if (k!=j){
    					if(grille[i][k] == grille[i][j]){
    						nombre_ok = false;
    					}
    				}
    			}
     
    			//Début de vérification de nombre pour la colonne
     
    			if(nombre_ok){//Si nombre_ok vaut true, on va sortir de la boucle parce que tout est juste
    			    //Boucle pour lister les différentes propriétés
    			    for(int k=0; k<9; k++){
    			        if(k!=i){
    			            if(grille[k][j] == grille[i][j]){
    			                nombre_ok = false;
    			            }
    			        }
    			    }
    			}
     
    			//Fin de vérification de nombre pour la colonne
    		}while (!nombre_ok);
    		//Fin de vérification de nombre pour la ligne!
     
    	}
    }
     
    for(int v=0; v<9;v++){
    	for(int h=0; h<9; h++){
    		cout << grille[v][h];
    		cout << " ";
    	}
    	cout << "\n";
    }
     
    }
    En fait le problème se situe aux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(nombre_ok){//Si nombre_ok vaut true, on va sortir de la boucle parce que tout est juste
    			    //Boucle pour lister les différentes propriétés
    			    for(int k=0; k<9; k++){
    			        if(k!=i){
    			            if(grille[k][j] == grille[i][j]){
    			                nombre_ok = false;
    			            }
    			        }
    			    }
    			}
     
    			//Fin de vérification de nombre pour la colonne
    Si on les mets en commentaires, le programme fonctionne et toutes les lignes du sudoku sont correctements remplies, mais pas les collones.

    J'ai relu plusieurs fois cette partie de code mais je ne vois pas pourquoi il fait bugger le programme.

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Tu devrais poster sur le forum algorithmes. Tu devrais restreindre au fur et mesure le domaine des possibles (par exemple, si dans une ligne tu as déjà 1, 2 et 7, tu ne devrais tirer le prochain nombre que dans l'ensemble {3,4,5,6,8,9}). Fais des recherches, c'est pas dit que ce soit polynomial de générer une grille aléatoire. Si c'est pas polynomial, renseigne toi du coté de la programmation par contraintes qui te permettra également de résoudre une grille. En tout cas, ton approche n'est pas la bonne, dans le principe, imagine une grille 100000*100000, sur une ligne, lorsque toutes les cases ont un nombre excepté la dernière, la probabilité que tu tires le bon nombre est de 1/100000, c'est normal que ton processeur soit occupé à 50%.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    A mon avis, un processeur occupé à 50% signifie juste que tu as un coeur occupé à 100%, sur une machine multicoeur (ici 2 coeurs).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Je viens de regarder ton code et j'ai compris pourquoi tu rentre dans une boucle sans fin.
    Imagine toi que tu ai remplis la premiere ligne comme cela et la deuxieme comme cela

    1 2 3 4 5 6 7 8 9
    8 7 6 5 4 3 2 1 _

    Quand tu va tirer le dernier numero de la deuxieme ligne et que tu va faire le test.
    Et bien tu ne peux mettre aucun numero et ton test n'ai jamais vrai.
    Et tu rentre dans une boucle sans fin.
    Il faut donc revoir ton algo.

Discussions similaires

  1. Algorithme de génération de grille concours de belote
    Par Elzetia dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 15/01/2015, 20h44
  2. génération d'une grille de sudoku
    Par gnouz dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 25/09/2008, 15h44
  3. [C++]Génération de grille sudoku
    Par theprogrammeur dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 05/07/2008, 11h05
  4. Génération de grilles de mots
    Par mavina dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 05/02/2008, 19h44
  5. Sudoku - générateur de grilles
    Par thegitch dans le forum Langage
    Réponses: 1
    Dernier message: 09/10/2007, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo