Bonjour à tous.
Je dois faire un sudoku pour mon projet et j’ai un problème avec un tableau de structure. En effet, après avoir placé une valeur dans une case avec la méthode des candidats uniques ( le programme "scan" la grille en regardant quelles cases ont un seul candidat et la remplit par ce dernier ) je dois forcement enlever ce candidat des cases voisines ( donc case de la même ligne / colonne / région ). Le problème est que … je n’y arrive pas , j’ai par exmple essayé de faire un décalage vers la gauche dans le tableau ou encore de remettre tout à 0 mais ca ne marche pas … mon programme s’arrete sans me dire d’erreur. Mon code :
#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 rechCaseUnique();
bool estCandUnique(int ,int ,int);
bool 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);
void fermerCase(int , int ,int);
void fermerGrille();
int main() {
int k=0,i,j;
lireGrille();
printf("Voici la grille initial :\n");
ecrireGrille();
initJeu();
for(i=0;i<9;i++){
for(j=0;j<9;j++){
for(k=1;k<=9;k++){
C[i][j].tab = malloc(9 * sizeof(int));
if(G[i][j]==0){
estCand(i,j,k);
}
}
}
}
fermerGrille();
ecrireGrille();
}
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;
printf("-------------------------------- \n");
for(i=0; i<9;i++){
printf("|");
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 && i!=8)
printf("|-----------------------------| \n");
}
printf("-------------------------------- \n");
}
void estCand(int i, int j, int k){
if ((absentSurLigne(k,G,i) && absentSurColonne(k,G,j) && absentSurBloc(k,G,i,j)) && k!=0){
C[i][j].nbc+=1;
C[i][j].tab[C[i][j].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 {
C[i][j].nbc=0;
C[i][j].tab=NULL;
O[NBO].x=i;
O[NBO].y=j;
NBO+=1;
}
}
}
}
bool appartient(int i, int j, int k){
int a=0;
for(a=1;a<TAILLE;a++){
if(k==C[i][j].tab[a]){
return true;
}
}
return false;
}
bool estCandUnique(int i, int j ,int k){
if(C[i][j].nbc==1 && C[i][j].tab[1]==k){
return true;
}
return false;
}
void rechCaseUnique(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
for(int k=1;k<=9;k++){
if(estCandUnique(i,j,k)){
fermerCase(i,j,k);
}
}
}
}
}
void fermerCase(int i, int j, int k){
G[i][j]=k;
C[i][j].nbc=0;
C[i][j].tab=NULL;
NBO-=1;
}
void fermerGrille(){
int i,j,k;
do{
rechCaseUnique();
for(i=0;i<9;i++){
for(j=0;j<9;j++){
for(k=1;k<=9;k++){
if(G[i][j]==0){
estCand(i,j,k);
}
}
}
}
} while(NBO==0);
}
La suppression doit être faite dans la fonction fermerCase.
Si besoin : le sujet https://www.mediafire.com/file/ma8k8zzl5ta088a/C_A1_sudoku_18_19.pdf/file
et le fichier sudoku.txt :https://www.mediafire.com/file/0nfdfyddn2cj59d/sudoku.txt/file
Merci d’avance