[C++] Génération de grille de Sudoku

chindit -  
 Utilisateur anonyme -
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:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
int grille[8][8];
//mise à 0 de la grille
for(int vert=0; vert<9; vert++){
for(int hor = 0; hor<9; hor++){
grille[vert][hor] = 8;
}
}

//Pour la génération des nombres aléatoires
srand(time(NULL));

//Les limites pour le tirage au sort
long max = 9;
long min = 1;
bool nombre_ok = false;

//Pour la sélection du nombre de la grille

for(int i=0; i<=8; i++){
for(int j=0; j<=8; j++){

while(!nombre_ok){
nombre_ok = true;
grille[i][j] = (rand() % (max - min + 1)) + min;
for(int k=0; k<9; k++){
if(grille[k][j] == grille[i][j]){
nombre_ok = false;
}
}
}

}
}

int v=0;

for(v; v<9;v++){
for(int h=0; h<9; h++){
cout << grille[v][h];
cout << " ";
}
cout << "\n";
}

}

Merci d'avance pour votre aide.

P.S.:Y a-t-il une balise "code" sur ce forum???
Configuration: Windows XP
Firefox 3.0

2 réponses

  1. Utilisateur anonyme
     
    #include <iostream> 
    #include <stdlib.h> 
    #include <time.h> 
    #include <stdio.h>
    
    using namespace std; 
    
    void main(){ 
    int grille[9][9]={0};//déclaration de la grille + mise à zéro
    
    //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++){
    		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;
    					}
    				}
    			}
    		}while (!nombre_ok);
    	} 
    }
    
    for(int v=0; v<9;v++){
    	for(int h=0; h<9; h++){ 
    		cout << grille[v][h]; 
    		cout << " ";
    	} 
    	cout << "\n"; 
    }
    system("pause");
    }


    J'ai modifié vraiment cette ligne là :
    if (k!=j){
    	if(grille[i][k] == grille[i][j]){ 
    		nombre_ok = false;
    	}
    }


    En effet, déjà tu avais inversé k et i dans ton tableau. Et de plus, il faut que tu fasses attention à ne pas comparer le nombre tiré au hasard avec lui même, d'où le k!=j.
    Ta déclaration de tableau n'était pas bonne non plus, tu dois indiquer le nombre d'éléments : ici 9 par 9.
    Voilà, tu remarqueras que ceci ne marche que pour les lignes, à toi de vérifier pour les colonnes aussi :).
    Bonne chance.

    ps : tu as pu remarqué une petite astuce d'initialisation de tableau ^^
    6
  2. Utilisateur anonyme
     
    Salut,
    attends je regarde ça.
    0