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