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

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. #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
    1. Salut,
      attends je regarde ça.
      0