Problème tableau structure pour sudoku ( c )

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous.

Je dois faire un sudoku pour mon IUT suivant certaines règles. ( https://www.mediafire.com/file/ma8k8zzl5ta088a/C_A1_sudoku_18_19.pdf/file)

Je dois faire une fonction appartient me disant si un nombre donné est bien candidat de la case i j ou non . Pour cela auparavant j’ai fais un tableau à allocation dynamique C[i][j].tab[new_nbc] = un candidat de la case . Le problème est que ma fonction appartient ne marche pas. En effet en faisant un printf du tableau C dans la fonction estCandidat ( celle ou je crée le tableau) , j’obtient les bon résultats avec un tableau normal , mais dans appartient si je printf mon tableau, cela m’affiche n’importe quoi …

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TAILLE 9
typedef struct {
    int x; // numéro de ligne
    int y; // numéro de colonne
} Case;
typedef struct {
    int nbc; // nombre de candidats
    int * tab; // table des candidats
} Cand;

Cand C[9][9];
Case O[81] ;
int NBO=0;
int G[TAILLE][TAILLE];
void lireGrille();
void ecrireGrille();
void estCand(int,int,int);
void initJeu();
void appartient(int , int ,int);
bool absentSurLigne (int, int G[9][9], int);
bool absentSurColonne (int, int G[9][9], int );
bool absentSurBloc (int, int G[9][9], int, int);



int main() {
    int k,i,j;
    int o,p,h;
    
    
    lireGrille();
    ecrireGrille();
    initJeu();
    for(i=0;i<9;i++){
        for(j=0;j<9;j++){
            
            C[i][j].nbc = 0;
            C[i][j].tab=NULL;
            C[i][j].tab = malloc(9 * sizeof(int));
            
            for(k=1;k<=9;k++){

                estCand(i,j,k);
                
            
            }
            
            
        }
        
    }
    scanf("%d %d %d", &o,&p,&h);
    appartient(o,p,h);
    
    
 
}
 
void lireGrille() {
     int i=0,j=0,z=0; //Variables pour initialisé le tableau G
    FILE* fichier = NULL;
    fichier = fopen("sudoku.txt", "r");
 
    if (fichier != NULL) {
                while(fscanf(fichier,"%d %d %d",&i,&j,&z)==3) {
                            G[i][j]= z;
                            
                                }
                                            
                fclose(fichier);
        
    }
    
    else {
 
        printf(" Une erreur c'est produite lors du chargement du fichier Sudoku !\n");
    }
    
}

void ecrireGrille(){
        int i=0;
        int j=0;
        int m=0;
    for(i=0; i<9;i++){
        for(j=0;j<9;j++){
            printf("%3d", G[i][j]);
            m+=1;
            if (m%3==0)
                printf("|");

            }
            
        printf("\n");
        if((i+1)%3==0 && i>0)
            printf("------------------------------ \n");
        }
    }   
        
void estCand(int i, int j, int k){
    if (absentSurLigne(k,G,i) && absentSurColonne(k,G,j) && absentSurBloc(k,G,i,j)){
        int new_nbc = C[i][j].nbc ++;
        C[i][j].nbc+=1;
        C[i][j].tab[new_nbc]=k;
    }

     
}
    

    
bool absentSurLigne (int k, int G[9][9], int i) //Test si une valeur k est absente sur la ligne i
{
    for (int j=0; j < 9; j++)
        if (G[i][j] == k)
            return false;
    return true;
}

bool absentSurColonne (int k, int G[9][9], int j)//Test si une valeur k est absente sur la colonne j
{
    for (int i=0; i < 9; i++)
        if (G[i][j] == k)
            return false;
    return true;
}

bool absentSurBloc (int k, int G[9][9], int i, int j)//Test si une valeur k est absente dans le bloc de la case[i][j]
{
    int x = i-(i%3), y = j-(j%3); 
    for (i=x; i < x+3; i++)
        for (j=y; j < y+3; j++)
            if (G[i][j] == k)
                return false;
    return true;
}

void initJeu(){
    int i,j;
    
    for(i=0; i<9;i++){
        for(j=0;j<9;j++){
            if(G[i][j]!=0){
                C[i][j].nbc=0;
                C[i][j].tab=NULL;
            }
            else {
                O[NBO].x=i;
                O[NBO].y=j;
                NBO+=1;
                
                
            }
            
        }
    }
}

void appartient(int i, int j, int k){
    int new_nbc = C[i][j].nbc ++;
    if(&k==C[i][j].tab[new_nbc]){
        printf("%d est bien candidat de la case %d %d \n", k, i ,j);
    }
}

Si besoin : le document sudoku.txt :https://www.mediafire.com/file/0nfdfyddn2cj59d/sudoku.txt/file

Merci d’avance

+0 -0

\o

Salut Yonah, c’est toujours mieux de partager ta solution :)
Déjà, si quelqu’un à le même problème que toi, en tombant sur ce sujet, il aura une réponse (ou au moins une indication).

Mais surtout, on peut te dire si c’est la bonne solution, te proposer mieux, t’éviter les grosses erreurs ou simplement ajouter un bien joué si c’est la solution idéale :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte