Menu

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

MIchelSardoche 2 Messages postés vendredi 12 janvier 2018Date d'inscription 14 janvier 2018 Dernière intervention - 12 janv. 2018 à 20:18 - Dernière réponse : MIchelSardoche 2 Messages postés vendredi 12 janvier 2018Date d'inscription 14 janvier 2018 Dernière intervention
- 14 janv. 2018 à 10:55
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.
Afficher la suite 

2 réponses

Répondre au sujet
Dalfab 328 Messages postés dimanche 7 février 2016Date d'inscription 24 avril 2018 Dernière intervention - 13 janv. 2018 à 16:40
0
Utile
1
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?
MIchelSardoche 2 Messages postés vendredi 12 janvier 2018Date d'inscription 14 janvier 2018 Dernière intervention - 14 janv. 2018 à 10:55
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.
Commenter la réponse de Dalfab