Probleme : Sudoku en C

seth59222 Messages postés 2 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 mai 2010 - 18 mai 2010 à 22:09
seth59222 Messages postés 2 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 mai 2010 - 18 mai 2010 à 22:13
Bonsoir, voila je suis actuellement en première année d'info, donc assez novice et je viens de créer ce petit bout de programme en C qui consiste a résoudre une grille de Sudoku mais je rencontre actuellement un soucis lors de l'exécution (grille totalement décalée, chiffre en bataille etc)

pouvez vous m'aider tout en restant dans cette méthode certainement grossière mais bon :s

Voici le Code source ::

#include<stdio.h>
#define MAX 10
#define MAZ 90
#define MAK 9
typedef int tab [MAX][MAX];
typedef int solval [MAZ];
typedef int ligne [MAK];

int nbvaleur ( tab t) //initialisation des valeurs du tableau à 0.
{int i,j,n=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if ( t[i][j]==0)
{n++;}
}
}
return n;
}

void init ( solval sol, int n)
{int i;
for (i=0;i<n;i++)
sol[i]=1;
}

int cresol ( solval sol, int n)
{int i,s=0;
for (i=0;i<n;i++)
{
s=s+sol[i];
}
if (s == n*9)
return 0;
sol[n-1]=sol[n-1]+1;
for (i=n-1;i>0;i--)
{
if ( sol[i]==10)
{
sol[i-1]=sol[i-1]+1;
sol[i]=1;
}
}
}

void recupsodu (tab t)
{FILE *f;
f=fopen("sudoku.txt","r");
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
fscanf(f,"%d",&t[i][j]);
}
}
fclose(f);
}


void affiche ( tab t)
{int z,i,j,n=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if ( t[i][j]==0)
printf(" ");
else printf("%d ",t[i][j]);
if (j==2 || j==5)
printf(" | ");
}
printf("\n");
if ( i==2 || i==5)
{
for (z=0;z<23;z++)
printf("-");
printf("\n");
}
}
}

void creanew (tab t, tab t2, solval sol) // création nouveau tableau
{int i,j,n=0;
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
t2[i][j]=t[i][j];
}
}
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
if ( t2[i][j]==0)
{
t2[i][j]=sol[n];
n++;
}
}
}
}

void initligne (ligne t) // initialisation des lignes
{int i;
for (i=0;i<9;i++)
t[i]=0;
}

int verif ( tab t) // vérification pour les ligne/colonne et carré
{int z,i,j,n;
char a;
ligne ts;
//affiche(t);
//scanf(" %c",a);
// pour les ligne
for (i=0;i<9;i++)
{initligne(ts);n=0;
for (j=0;j<9;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les lignes\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

//pour les colonnes
for(i=0;i<9;i++)
{
initligne(ts);n=0;
for(j=0;j<9;j++)
{
for(z=0;z<9;z++)
{
if ( t[j][i]==ts[z])
{//printf("pour les colonnes\n");
return 0;}
}
ts[n]=t[j][i];
n++;
}
}
//pour les carres
initligne(ts);n=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=1;i<3;i++)
{
for(j=3;j<6;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=1;i<3;i++)
{
for(j=6;j<9;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=3;i<6;i++)
{
for(j=0;j<3;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=3;i<6;i++)
{
for(j=3;j<6;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=3;i<6;i++)
{
for(j=6;j<9;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=6;i<9;i++)
{
for(j=0;j<3;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=6;i<9;i++)
{
for(j=3;j<6;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

initligne(ts);n=0;
for(i=6;i<9;i++)
{
for(j=6;j<9;j++)
{
for (z=0;z<9;z++)
{
if ( t[i][j]==ts[z])
{//printf("pour les carres\n");
return 0;}
}
ts[n]=t[i][j];
n++;
}
}

return 1;
}

void affichesol ( solval t, int n)
{int i;
for(i=0;i<n;i++)
printf("%d",t[i]);
printf("\n");

}
void resul ( tab t)
{int z=0,n,a=1;
solval sol;
tab t2;
n=nbvaleur(t);
printf("%d\n\n",n);
init(sol,n);
while ( z==0 && a==1)
{

a=cresol(sol,n);
//affichesol(sol,n);

creanew(t,t2,sol);
//fiche(t2);
//printf("*\n");
z=verif(t2);
}
if (z==0)
printf("il n'y a pas de solution\n");
else
{ printf("\n");affiche(t2);
}
}

main()
{tab t;

recupsodu(t);
affiche(t);
resul(t);
system("pause");
return 0;
}

Merci d'avance pour votre aide :(

1 réponse

seth59222 Messages postés 2 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 mai 2010
18 mai 2010 à 22:13
j'ajoute aussi la composition de mon fichier sudoku.txt


640013900
100026400
029045700
002000830
860037019
700209000
001300690
939408020
005000000
0
Rejoignez-nous