Bonjour

Je suis entrain d'essayer de créer un algorithme de génération de grille du sudoku mais je bloque encore un peu.

Pour l'instant j'ai une boucle infinie et je ne vois pas pourquoi.

Quelqu'un saurait-il m'aider?

Voici mon code:
Code C++ : 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
 
using namespace std;
 
int main(){
 
    //Initialisations
    int grille[9][9];
    int grille_temp[3][9];
    int min = 1, max = 9, ligne = 0;
    bool boucle_ok = true, nombre_ok = false, possibilites[9], carre_ok = true, ligne_ok = true;
 
    //MISES A ZERO
 
    //grille
    for(int i=0; i<9; i++){
        for(int j=0; j<9; j++){
            grille[i][j] = 0;
        }
    }
 
    //grille_temp
    for(int i=0; i<3; i++){
        for(int j=0; j<9; j++){
            grille_temp[i][j] = 0;
        }
    }
 
    //Tableau de bool
    for(int i=0; i<9; i++){
        possibilites[i] = false;
    }
 
    //Initialisation du temps
    srand(time(NULL));
 
    //Remplissage de la grille
    while(boucle_ok){
        //Génération de la première ligne
        for(int i=0; i<9; i++){
            do{
			nombre_ok = true;
			grille[ligne][i] = (rand() % (max - min + 1)) + min;
                for(int k=0; k<9; k++){
                    if (k!=i){
                        if(grille[ligne][k] == grille[ligne][i]){
                            nombre_ok = false;
                        }
                    }
                }
            }while (!nombre_ok);
        }
        //Fin de génération de la première ligne
        if(ligne == 0 || ligne == 3 || ligne == 6){//Si c'est la première ligne, elle est bonne
            ligne++;
        }
        else{
            for(int t= (ligne - 1); t>=0; t--){
                for(int w=0; w<9; w++){
                    if(grille[t][w] == grille[ligne][w]){
                        ligne_ok = false;
                    }
                }
            }
 
            //Si "ligne" vaut toujous 2, les 3 premières lignes sont bonnes, on les passe à la "moulinette du carré"
            if((ligne_ok && ligne == 2) || (ligne_ok && ligne == 5) || (ligne_ok && ligne == 8)){
                //Premier carré
                for(int k=(ligne - 2); k<=ligne; k++){
                    for(int l=0; l<3; l++){
                        possibilites[(grille[k][l] - 1)] = true;
                    }
                }
                //Vérification
                for(int m=0; m<9; m++){
                    if(!possibilites[m]){
                        carre_ok = false;
                    }
                }
 
                //Remise à zéro de la variable
                for(int i=0; i<9; i++){
                    possibilites[i] = false;
                }
                //Fin du premier carré
 
                //Après le premier carré, le second, mais seulement si le premier est juste
                if(carre_ok){
                    for(int k=(ligne - 2); k<=ligne; k++){
                        for(int l=3; l<6; l++){
                            possibilites[(grille_temp[k][l] -1)] = true;
                        }
                    }
                    //Vérification
                    for(int m=0; m<9; m++){
                        if(!possibilites[m]){
                            carre_ok = false;
                        }
                    }
 
                    //Remise à 0 de la variable
                    for(int i=0; i<9; i++){
                        possibilites[i] = false;
                    }
 
                    //Si le deuxième carré est juste, on passe au troisième
                    if(carre_ok){
                        for(int k=(ligne - 2); k<=ligne; k++){
                            for(int l=6; l<9; l++){
                                possibilites[(grille_temp[k][l] -1)] = true;
                            }
                        }
                        //Vérification
                        for(int m=0; m<9; m++){
                            if(!possibilites[m]){
                                carre_ok = false;
                            }
                        }
 
                        //Remise à 0 de la variable
                        for(int i=0; i<9; i++){
                            possibilites[i] = false;
                        }
                    }
                }
                else{//Si ce n'est pas bon, c'est reparti pour la génération des 2 lignes
                    ligne = ligne -1;
                }
            }
            else if(ligne_ok){
                ligne++;
            }
            else{
                //Si la ligne est fausse, on remet le bool "ligne_ok" à true
                ligne_ok = true;
            }
        }
 
        //Si on est à la fin de la grille
        if(grille[9][9] != 0){
            boucle_ok = false;
        }
 
    }
 
 
//Ecriture de la grille générée
 
for(int v=0; v<9;v++){
	for(int h=0; h<9; h++){
		cout << grille[v][h];
		cout << " ";
	}
	cout << "\n";
}
 
}

Merci d'avance pour votre aide.