[Algo - C] algo foireux ?

Elfarouge -  
 Arezki1985 -
Bonjour à tous et à toutes !
J'ai un petit problème tel que j'en recontre rarement. Un programme en C que j'ai écrit ne fonctionne pas correctement !

On définit dans le code un tableau de 9*9 en variable globale, et la fonction suivante se doit de vérifier s'il s'agit d'une grille de sudoku correctement remplie. Elle retourne 1 le cas échéant, 0 sinon. Il semble néanmoins qu'elle ne remplit pas son objectif, ce que je ne comprends pas après avoir maintes fois relu le code.

Pouvez-vous m'aider ?
Merci beaucoup

la fonction :
int test_sudoku(void)
{
    int i, j, k, l, m, val ;
    int verif[9] ;   
    for (i = 0 ; i < 9 ; i++ )
    {
        for (k = 0 ; k < 9 ; k++)
            verif[k] = 0 ;
        for (j = 0 ; j < 9 ; j++)
        {
            val = sudoku[i][j] ;
            if(verif[val] == 1)
                return 0 ;
            else
                verif[val] = 1 ;
        }
    }
    for (i = 0 ; i < 9 ; i++ )
    {
        for (k = 0 ; k < 9 ; k++ )
            verif[k] = 0 ;
        for (j = 0 ; j < 9 ; j++)
        {
            val = sudoku[j][i] ;
            if(verif[val] == 1)
                return 0 ;
            else
                verif[val] = 1 ;
        }
    }
    for(i = 0 ; i < 9 ; i + 3)
    {
        for(j = 0 ; j < 9 ; j + 3)
        {
            for(k = 0 ; k < 9 ; k++)
                verif[k] = 0 ;
            for(l = 0 ; l < 3 ; l++)
            {
                for(m = 0 ; m < 3 ; m++)
                {
                    val = sudoku[i+l][j+m] ;
                    if (verif[val] == 1)
                        return 0 ;
                    else if (verif[val] == 0)
                        verif[val] = 1 ;
                }
            }
        }
    }
    return 1 ;
}

3 réponses

  1. Lazarey Messages postés 3255 Date d'inscription   Statut Membre Dernière intervention   746
     
    Slt,

    Je n'ai jamais fais de C, mais que du C++. Mais il me semble qu'une fonction void ne retourne rien, d'ou ton problème.
    Il faut que tu passe ta grille en paramètre :

    int test_sudoku(tableau de sudoku à vérifier)


    Sinon, je sais pas si ça existe aussi en C mais essaye d'utiliser un booléen. La fonction retourne vrai su c'est une grille correcte, ou faux sinon. Ca donne :

    bool test_sudoku(tableau de sudoku à vérifier)
    0
  2. Arezki
     
    Slt Elfarouge,

    j'ai posé le probléme à un ami qui métrise trés bien le C et il a trouvé deux fautes:

    1ère faute: Il faut changer val = sudoku[i][j] - 1 dans 3endroit;
    2ème faute: il faut 'j=j+3' au lieu de 'j + 3' dans les boucles for, pareil pour le i
    cela devrait marché puisk on l'a essayé et sa marche
    0
  3. Arezki1985
     
    Ce code marche bien : de la part de sam:

    #include <stdio.h>

    int sudoku[9][9] = {
    {9, 8, 7, 3, 6, 1, 5, 2, 4},
    {1, 5, 2, 9, 4, 8, 7, 6, 3},
    {6, 3, 4, 7, 2, 5, 8, 9, 1},
    {8, 6, 1, 5, 9, 2, 3, 4, 7},
    {7, 2, 9, 1, 3, 4, 6, 5, 8},
    {3, 4, 5, 6, 8, 7, 2, 1, 9},
    {2, 9, 3, 4, 7, 6, 1, 8, 5},
    {4, 1, 6, 8, 5, 3, 9, 7, 2},
    {5, 7, 8, 2, 1, 9, 4, 3, 6}
    };

    int main (){
    print_sudoku();

    if(test_sudoku()==1)
    printf("La solution est bonne!");
    else
    printf("La solution n'est PAS bonne!");
    }

    int test_sudoku(void)
    {
    int i, j, k, l, m, val ;
    int verif[9] ;
    for (i = 0 ; i < 9 ; i++ )
    {
    for (k = 0 ; k < 9 ; k++)
    verif[k] = 0 ;
    for (j = 0 ; j < 9 ; j++)
    {
    val = sudoku[i][j] - 1;
    if(verif[val] == 1)
    return 0 ;
    else
    verif[val] = 1 ;
    }
    }
    for (i = 0 ; i < 9 ; i++ )
    {
    for (k = 0 ; k < 9 ; k++ )
    verif[k] = 0 ;
    for (j = 0 ; j < 9 ; j++)
    {
    val = sudoku[j][i] - 1;
    if(verif[val] == 1)
    return 0 ;
    else
    verif[val] = 1 ;
    }
    }
    for(i = 0 ; i < 9 ; i += 3)
    {
    for(j = 0 ; j < 9 ; j += 3)
    {
    for(k = 0 ; k < 9 ; k++)
    verif[k] = 0 ;
    for(l = 0 ; l < 3 ; l++)
    {
    for(m = 0 ; m < 3 ; m++)
    {
    val = sudoku[i+l][j+m] - 1;
    if (verif[val] == 1)
    return 0 ;
    else if (verif[val] == 0)
    verif[val] = 1 ;
    }
    }
    }
    }
    return 1 ;
    }

    int print_sudoku(void) {
    int i, j;
    for (i = 0 ; i < 9 ; i++ ){
    for (j = 0 ; j < 9 ; j++){
    printf("%d ",sudoku[i][j]);
    }
    printf("\n\n");
    }
    return 0;
    }
    0