Language C: basique :sudoku 9*9 [Résolu/Fermé]

Signaler
Messages postés
2
Date d'inscription
vendredi 12 janvier 2018
Statut
Membre
Dernière intervention
14 janvier 2018
-
Messages postés
2
Date d'inscription
vendredi 12 janvier 2018
Statut
Membre
Dernière intervention
14 janvier 2018
-
Bonsoir à tous, je cherche à faire un sudoku en language C pour un projet scolaire. Mon programme est presque finit mais je rencontre un problème lors de la définition de mon tableau (en toute fin de programme). Lors de l'exécution je n'arrive pas à afficher mes données dans le tableau et la demande de données est donc sans fin.
Je vous met le programme ci-dessous si quelqu'un a le courage de me faire remarquer mon erreur ou de me proposer une amélioration
Merci d'avance

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
// Fonction d'affichage
void affichage (int sudoku[9][9])
{
    int i,j;
    for(i=0; i<9; i++)
    {
        for(j=0; j<9; j++)
        {
            printf( ((j+1)%3) ? "%d " : "%d|", sudoku[i][j]);
        }
        putchar('\n');
        if (!((i+1)%3))
            puts("------------------");
    }
    puts("\n\n\n");
}

bool VerifieLigne (int k, int sudoku[9][9], int i)
{
    int j;
    for (j=0; j < 9; j++)
        if (sudoku[i][j] == k)
            return false;
    return true;
}

bool VerifieColonne (int k, int sudoku[9][9], int j)
{
    int i;
    for (i=0; i < 9; i++)
        if (sudoku[i][j] == k)
            return false;
    return true;
}

bool VerifieBloc (int k, int sudoku[9][9], int i, int j)
{
    int _i = i-(i%3), _j = j-(j%3);
    for (i=_i; i < _i+3; i++)
        for (j=_j; j < _j+3; j++)
            if (sudoku[i][j] == k)
                return false;
    return true;
}

bool Valide (int sudoku[9][9], int position)
{
    int i,k,j;
    if (position == 9*9)
        return true;

    i= position/9, j = position%9;

    if (sudoku[i][j] != 0)
        return Valide(sudoku, position+1);

    for (k=1; k <= 9; k++)
    {
        if (VerifieLigne(k,sudoku,i) && VerifieColonne(k,sudoku,j) && VerifieBloc(k,sudoku,i,j))
        {
            sudoku[i][j] = k;

            if ( Valide (sudoku, position+1) )
                return true;
        }
    }
    sudoku[i][j] = 0;

    return false;
}

int main (void)
{
    int sudoku[9][9],i,j,a;
    //INITIALISATION DU TABLEAU
    for(i=0; i<=4-1; i++)
    {
        for(j=0; j<=4-1; j++)
        {
            sudoku[i][j]=0;
        }
    }
    //DEMANDE DES DONNEES
do
    {
        printf("Entrer les coordonnees de la case voulue\n");
        printf("Entrer la ligne de la case voulue\n");
        scanf("%d,&x");
        printf("Entrer la colonne de la case voulue\n");
        scanf("%d,&y");
        printf("Entrer la valeur de la case voulue\n");
        scanf("%d,&sudoku[x][y]");
        printf("Tant que vous souhaiter entrer des valeurs tapez 1 sinon tapez 0 pour commencer le jeu\n");
        scanf("%d,&a");
    }
while(a=1);
    
 Valide(sudoku,0);

    printf("Grille du Sudoku\n");
    affichage(sudoku);
    return 0;
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

Messages postés
568
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
13 juin 2021
77
Bonjour,
Lignes 79 à 85, tu n'initialises qu'une partie de la grille au lieu de toute la grille.
Ligne 99, au lieu de tester si a vaut bien 1, tu écris la valeur 1 dans a. C'est ton erreur et le compilateur a dû te le signaler par un beau warning!
Ligne 101, tu appelles une fonction assez complexe, mais tu ignores complètement son résultat, alors pourquoi l'appeler?
Messages postés
2
Date d'inscription
vendredi 12 janvier 2018
Statut
Membre
Dernière intervention
14 janvier 2018

Bonjour et merci pour tes correction j'ai corrigé tes deux premières remarques. Ligne 101 j'utilise cette fonction pour qu'elle résolve ma grille avec les données que j'ai entré précédemment. En fait je ne m'intéresse pas directement à ce qu'elle renvoie mais aux modifications qu'elle fait sur ma grille pour que je puisse afficher mon sudoku résolu ensuite.