Sudoku
Fermé
abcd
-
3 janv. 2015 à 12:31
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015 - 7 janv. 2015 à 11:45
evilfalcon Messages postés 58 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 10 novembre 2015 - 7 janv. 2015 à 11:45
A voir également:
- Sudoku
- Sudoku gratuit à télécharger - Télécharger - Puzzle & Réflexion
- Sudoku gratuit télécharger - Télécharger - Jeux vidéo
- Sudoku en c - Forum C++
- Comment créer un sudoku sur excel ✓ - Forum Internet / Réseaux sociaux
- Programme sudoku - Forum Programmation
2 réponses
Whismeril
Messages postés
18279
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mars 2023
888
3 janv. 2015 à 18:12
3 janv. 2015 à 18:12
Bonsoir, je pense que tu as pris une mauvaise voie.
Tirer une grille aléatoirement et regarder après si elle respecte une contrainte (même moins forte que la règle du sudoku) c'est se retrouver avec la probabilité de 99,99999% de déchets.
A mon sens le mieux est de mettre la contrainte à chaque case tirée.
Je ne fais pas de c, alors je vais te proposer un principe.
Je suppose qu'on peut faire un tableau à deux dimensions, je le crée et mets 0 partout (on n'aura pas de risque de problème de valeur nulle par la suite).
A chaque case on va initialiser un tableau des autorisés de taille variable.
Pour ce faire, une boucle de 1 à 4 (variable i).
Pour i je regarde si la valeur existe dans la ligne, donc je la parcours avec une boucle.
Si oui on passe au i suivant.
Si non, on parcourt la colonne.
Si la valeur est présente dans la colonne, on passe au i suivant.
Si non, on mets ce i dans les autorisés.
Par exemple pour ce début de grille
2 4 1 3
1 x
Pour X, 1 est exclus par la ligne et 4 par la colonne.
Il me reste 2 et 3 dans les autorisés.
Donc pour X j'ai un tableau de deux cellules, je dois donc faire un tirage aléatoire entre l'index 0 et l'index 1 qui me retourneront réciproquement les valeurs 2 et 3.
Disons que je trouve 3
2 4 1 3
1 3 y
Et bien pour Y, mes autorisés sont 2 et 4, etc.....
Tirer une grille aléatoirement et regarder après si elle respecte une contrainte (même moins forte que la règle du sudoku) c'est se retrouver avec la probabilité de 99,99999% de déchets.
A mon sens le mieux est de mettre la contrainte à chaque case tirée.
Je ne fais pas de c, alors je vais te proposer un principe.
Je suppose qu'on peut faire un tableau à deux dimensions, je le crée et mets 0 partout (on n'aura pas de risque de problème de valeur nulle par la suite).
A chaque case on va initialiser un tableau des autorisés de taille variable.
Pour ce faire, une boucle de 1 à 4 (variable i).
Pour i je regarde si la valeur existe dans la ligne, donc je la parcours avec une boucle.
Si oui on passe au i suivant.
Si non, on parcourt la colonne.
Si la valeur est présente dans la colonne, on passe au i suivant.
Si non, on mets ce i dans les autorisés.
Par exemple pour ce début de grille
2 4 1 3
1 x
Pour X, 1 est exclus par la ligne et 4 par la colonne.
Il me reste 2 et 3 dans les autorisés.
Donc pour X j'ai un tableau de deux cellules, je dois donc faire un tirage aléatoire entre l'index 0 et l'index 1 qui me retourneront réciproquement les valeurs 2 et 3.
Disons que je trouve 3
2 4 1 3
1 3 y
Et bien pour Y, mes autorisés sont 2 et 4, etc.....
evilfalcon
Messages postés
58
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
10 novembre 2015
7 janv. 2015 à 11:45
7 janv. 2015 à 11:45
pour le fun, je l'ai fait:
par contre, je pense qu'il y a beaucoup mieux!
Mais la, il faut faire des maths avec certainement une étude de rapidite convergence. Je laisse les pros s'amuser dessus!!!
int main()
{
int sudoku[4][4];
int lance = 0;
int verif = 0;
int i,j,k,l;
int debug = 0;
srand (time (NULL));
for (l=0; l<10;l++)
{
for (k = 0; k < 4; k++)
{
for (j = 0; j < 4; j++)
{
debug = 0;
do
{
verif = 0;
lance = (rand () % (0-4)) +1;
for (i = 0; i<=j; i++)
{
if (lance == sudoku[k][i])
{
verif = 1;
}
}
for (i = 0; i<=k; i++)
{
if (lance == sudoku[i][j])
{
verif = 1;
}
}
debug++;
if (debug == 20)
{
verif = 0;
k = 0;
j = 0;
}
}while(verif == 1);
//printf("i = %d, k = %d, lance = %d\n",i,k,lance);
sudoku[k][j] = lance;
}
}
printf("sudoku %d\n",l+1);
for (i = 0 ; i<4 ;i++)
{
for (j = 0; j < 4; j++)
{
printf(" %d ",sudoku[i][j]);
}
printf("\n");
}
printf("\n");
printf("\n");
}
return 0;
}
par contre, je pense qu'il y a beaucoup mieux!
Mais la, il faut faire des maths avec certainement une étude de rapidite convergence. Je laisse les pros s'amuser dessus!!!
4 janv. 2015 à 00:57
je te remercie beaucoup pour ta réponse. je vais regarder tous cela deamain et je tient au courant.
merci.....