Sudoku

abcd -  
evilfalcon Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je souhaite programmer un sudoku pour enfant, c'est à dire un sudoku sur 4*4.
j'ai tout d'abord générer un chiffre aléatoire entre 1 et 4 sans doublon
j'ai alors stocker dans un tableau de 4 chiffres.
j'ai répéter l'opération 3 fois pour obtenir le sudoku.
Maintenant, je dois trier les 4 tableaux pour respecter les règles du sodoku, c'est à dire un nombre unique en ligne et colonne. Mais je ne vois pas comment faire cette étape. Pouvez vous m'aider?

merci par avance!
A voir également:

2 réponses

Utilisateur anonyme
 
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.....
0
abcd
 
Bonjour,
je te remercie beaucoup pour ta réponse. je vais regarder tous cela deamain et je tient au courant.
merci.....
0
evilfalcon Messages postés 58 Date d'inscription   Statut Membre Dernière intervention  
 
pour le fun, je l'ai fait:

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!!!
0