Sudoku backtracking

Fermé
souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 - 5 janv. 2009 à 19:23
souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 - 5 janv. 2009 à 19:49
Bonjour,
j'ai reussi a resoudre le problemme du sudoku mais il me reste un petit probleme c'est que il faut que le resultat s'affiche dans les cases du sudoku ce qui est un peu compliqué s'i vous plait adiez moi a le faire:
#include<stdio.h>
#include<time.h>
#include <dos.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
/*********Déclaration des vriables globales********************/
int M[9][9];
int G[9][9];
/*******Déclaration des prototypes de différents fonctions*********/
void premierePage();
void dessinerGrille();
void initialisationMatrice();
void remplissageGrille();
int test(int,int,int,int [9][9]);
void affichageMatrice();
int solution(int G[9][9]);
int vide(int,int);
/*==============================================================================
======================Fonction d'affichage de la premiere page==================
==============================================================================*/
void premierePage()
{
clrscr();
textcolor(30);
gotoxy(12,3);
cprintf("*********** Ecole Marocaine des Science de l'Igenieur ********");
gotoxy(14,5);
cprintf("**** 2eme annee Informatique et Reseaux****");
sleep(3);
gotoxy(16,7);
cprintf("** Mini Projet de Programmation En C :SUDUKU **");
sleep(3);
gotoxy(17,12);
printf("\a\a\a");
cprintf("******* Bienvenue dans notre programme ********");
sleep(3);
gotoxy(22,22);
cprintf("Encadree par :\n");
cprintf("\n Professeur: <Benhsain Azzedine>");
gotoxy(22,25);
cprintf("\nRealisee par :\n");
cprintf("<EZZIANI Loubna> et <BOUHSAINA Salma>");
sleep(2);
}

/*==============================================================================
======================Fonction pour dessiner la grille du sudoko================
==============================================================================*/
void dessinerGrille()
{
int k=25,m=27,n=26,j=24;
int o=186;
int t=205;
int i;
clrscr();
textcolor(20);
cprintf("\n-Pour remplir les cases, vous pouvez utilisez les touches %c ou %c ou %c ou %c",n,m,j,k);
gotoxy(3,11);
printf(" %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",t-4,t,t,t,t-2,t,t,t,t-2,t,t,t,t-2,t-2,t,t,t,t-2,t,t,t,t-2,t,t,t,t-2,t-2,t,t,t,t-2,t,t,t,t-2,t,t,t,o+1);
for(i=0;i<9;i++)
{
if(i==3||i==6)
{
printf("\n %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",t-1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,o-1);
printf("\n %c %c %c %c%c %c %c %c%c %c %c %c",o,o,o,o,o,o,o,o,o,o,o,o);
printf("\n %c %c %c %c%c %c %c %c%c %c %c %c",o,o,o,o,o,o,o,o,o,o,o,o);
printf("\n %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",t-1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,o-1);
}
else
{

printf("\n %c %c %c %c%c %c %c %c%c %c %c %c",o,o,o,o,o,o,o,o,o,o,o,o);
printf("\n %c %c %c %c%c %c %c %c%c %c %c %c",o,o,o,o,o,o,o,o,o,o,o,o);
printf("\n %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",t-1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,t+1,t+1,t,t,t,t+1,t,t,t,t+1,t,t,t,o-1);
}
}
printf("\r %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",t-5,t,t,t,t-3,t,t,t,t-3,t,t,t,t-3,t-3,t,t,t,t-3,t,t,t,t-3,t,t,t,t-3,t-3,t,t,t,t-3,t,t,t,t-3,t,t,t,o+2);
}
/*==============================================================================
======================Fonction d'initialisation de la matrice===================
==============================================================================*/
void initialisationMatrice()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
M[i][j]=0;
}
}
}
/*==============================================================================
======================Fonction de test des valeurs saisies======================
==============================================================================*/
int test(int ligne,int colonne,int c,int M[9][9])
{ int q,p,L,C;
//tester au niveau de la colonne
for(q=0;q<9;q++)
{
if(q!=colonne)
{
if(M[ligne][q]==c)
{
return 1;
}
}
}
//tester au niveau de la ligne
for(p=0;p<9;p++)
{
if(p!=ligne)
{
if(M[p][colonne]==c)
{
return 1;
}
}
}
//tester au niveau de la région
L=(ligne/3)*3;
C=(colonne/3)*3;
for(p=L;p<L+3;p++)
{
for(q=C;q<C+3;q++)
{
if((p!=ligne)&&(q!=colonne))
{
if(M[p][q]==c)
{
return 1;
}
}
}

}
return 0;
}
/*==============================================================================
======================Fonction de remplissage de la grille======================
==============================================================================*/
void remplissageGrille()
{ int a,b,x,y;
char c;
int i,j;
a=x=15;
b=y=13;
i=j=0;
gotoxy(a,b);
c=getch();
do
{
if(c==0)
{
c=getch();
switch(c)
{
case 77:if(x==(23)||x==(36)) //fleche droite
{
x+=5;
j+=1;
}
else
{
x+=4;
j+=1;
}
gotoxy(x,y);
if(x>49)
{
gotoxy(a,y);
x=a;
j=0;
}
break;
case 75:if(x==(28)||x==(41)) //fleche gauche
{
x-=5;
j-=1;
}
else
{
j-=1;
x-=4;
}
gotoxy(x,y);
if(x<15)
{
gotoxy(49,y);
x=49;
j=8;
}
break;
case 80:if(y==(19)||y==29) //fleche bas
{
y+=4;
i+=1;
}
else
{
y+=3;
i+=1;
}
gotoxy(x,y);
if(y>39)
{
gotoxy(x,b);
y=b;
i=0;
}
break;
case 72:if(y==23 || y==33) //fleche haut
{
i-=1;
y-=4;
}
else
{
i-=1;
y-=3;
}
gotoxy(x,y);
if(y<13)
{
gotoxy(x,39);
y=39;
i=8;
}
break;
}
}
else
{
switch(c)
{
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57: if(test(i,j,c-'0',M)==0)
{
cprintf("%c",c);M[i][j]=c-'0';gotoxy(x,y);
}break;
case 8: cprintf(" ");M[i][j]=0;gotoxy(x,y);break;
}
}

c=getch();
}
while(c!=13);
}
/*==============================================================================
=====================Fonction de copier les valeur de M à G=====================
==============================================================================*/

/*==============================================================================
========================Fonction de tester les cases vide=======================
==============================================================================*/
int vide(int i,int j)
{
if(M[i][j])
{
return 1;
}
return 0;
}

/*==============================================================================
=============================Fonction de solution===============================
==============================================================================*/
int solution(int G[9][9])
{
int i,j;
i=0;
while(i<9)
{
j=0;
while(j<9)
{
if(!vide(i,j))
{
do
{
G[i][j]+=1;
}
while((G[i][j]<10)&&(test(i,j,G[i][j],G)));
if(G[i][j]==10)
{
G[i][j]=0;
do
{
j--;
if(j==(-1))
{
j=8;
i--;
if(i==(-1))
{
return 0;
}
}
}
while(vide(i,j));
}
else
{j++;
}
}
else
j++;
}
i++;
}
return 1;
}
/*==============================================================================
======================Fonction d'affichage de la matrice =======================
==============================================================================*/
void affichageMatrice()
{
int i,j;
clrscr();
printf("\n\nla matrice est:\n\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
cprintf("%5d",M[i][j]);
}
printf("\n\n");
}
}


/*******************************************************************************
*******************************Programme principal******************************
*******************************************************************************/
int main()
{
int i,j;

// premierePage();
dessinerGrille();
initialisationMatrice();
remplissageGrille();
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
G[i][j]=M[i][j];
}
}
clrscr();
if(solution(G)==1)
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
M[i][j]=G[i][j];
}
}
affichageMatrice();
}
else
{
printf("\nPas de solution\n");
}
getch();
return 0;
}
A voir également:

1 réponse

souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 26
5 janv. 2009 à 19:49
bonjour,
voila la partie solution de la grille sudoku mais il me faut que ca soit avec la recurssivité
sil vous plait aidez moi a la rendre recurssif je lai fait itteratif:

int solution(int G[9][9])
{
int i,j;
i=0;
while(i<9)
{
j=0;
while(j<9)
{
if(!vide(i,j))
{
do
{
G[i][j]+=1;
}
while((G[i][j]<10)&&(test(i,j,G[i][j],G)));
if(G[i][j]==10)
{
G[i][j]=0;
do
{
j--;
if(j==(-1))
{
j=8;
i--;
if(i==(-1))
{
return 0;
}
}
}
while(vide(i,j));
}
else
{j++;
}
}
else
j++;
}
i++;
}
return 1;
}
0