Rechercher : dans
Par :

Sudoku résolu en langage C

Dernière réponse le 30 nov 2008 à 23:28:42 Duvielbourg, le 9 avr 2006 à 15:25:36 
 Signaler ce message aux modérateurs

Si cela peut aider, vous trouverez le source pour résoudre les grilles de sudoku à :
http://www.i2i.fr/
Langage C. Méthode récursive. Mis à part la saisie, 25 lignes d'instruction suffisent.
A+

Meilleures réponses pour « Sudoku résolu en langage C » dans :
Langage C++ - Les types de données Voir Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données Voir Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
Introduction au langage C VoirPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie...

1

ouar830110, le 16 sep 2006 à 20:11:34

Bjr eske tu peux menvoyet la procedure k tu as utilisé pour le problème de sudocu
merci

Répondre à ouar830110

2

josian, le 11 déc 2007 à 17:42:13

J'aimerais avoir l'algorithme corrigé du jeu sudoku pour m'entrainer aux exams...

Répondre à josian

3

gentille, le 7 mai 2008 à 12:11:06

Bonjour j'aurai voulu avoir le programme complet du jeu de sudoku en langage c

Répondre à gentille

4

amatoallah, le 17 sep 2008 à 16:22:18

Slt
désolé,c'est ou~ le source?

Répondre à amatoallah

5

 smixx, le 30 nov 2008 à 23:28:42
  • +4

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <io.h>
#include <dos.h>

int joueur; //1 si oui 0 sinn(arbitre)
int oui=0; // un sudoku deja enregistré par l'arbitre ?
int SDK_a[9][9];
int SDK_j[9][9];
int SDK_s[9][9];
int SDK_copi[81]; // tableau ou on va stocker la matrice pour detecter les cases vides (reste inchangé)
int ind_1_cv; // var globale indice de la 1ere case vide ds le tableau copi

/***************************** Fct gestion curseur ****************************/
void curseur(int curseur_on)
{
int d,f;
union REGS rin,rout;
if(curseur_on) { d=3; f=4; } else { d=17; f=16; }
rin.h.ch=d;
rin.h.cl=f;
rin.h.ah=1;
int86(0x10,&rin,&rout);
}
//****************************** Fct BIENVENUE ******************************//
void bienvenue()
{
int l; clrscr(); curseur(0);
for(l=7;l<26;l++)
{ gotoxy(11,l); textbackground(11);cprintf(" ");}
gotoxy(11,7);textcolor(8); cprintf("Ú ¿");
gotoxy(11,25); cprintf("À Ù");

gotoxy(36,9); textcolor(1); cprintf("SU DO KU");
gotoxy(29,9); textcolor(4+128); cprintf("  "); gotoxy(46,9); cprintf("  ");
gotoxy(26,11); textcolor(9); cprintf(" Version beta / Realis‚ par:");
gotoxy(15,13); textcolor(8); cprintf("Badr BRIOUAL SA@d HAFFAR");

textbackground(0);textcolor(WHITE); delay(4000) ;
}
//*************************** Fct Msg pas solution ***************************//
void msg(char ch[])
{
clrscr(); curseur(0);
gotoxy(20,13);textcolor(14+128); cprintf("%s",ch);textcolor(15);
gotoxy(15,10);textbackground(2); cprintf(" ");
gotoxy(15,16);cprintf(" "); textbackground(0);
delay(1500);
}
/********************** Fct Suppression ac un backspace ***********************/
void suppression(int i, int j, int J, int I)
{ gotoxy(i+1,j);
printf("\b"); // on fait un backspace
printf(" "); // on remplace le caractere par un espace
printf("\b"); // on revient o debut
if(joueur) SDK_j[J][I]=0; else SDK_a[J][I]=0;
}
///////////////////////// Fct Affichage grille resolue /////////////////////////
void aff_sol()
{
int I,J, i,j; curseur(0);
for(I=0,i=9;I<=8;i+=4,I++)
for(J=0,j=25;J<=8;j+=4,J++)
{gotoxy(j,i); if (SDK_s[I][J]!=SDK_a[I][J]) {textcolor(WHITE);} else {textcolor(11);} cprintf("%d",SDK_s[I][J]);}
}
//********************************************
void affich_sdk_jr()
{
int I,J, i,j;
for(I=0,i=9;I<=8;i+=4,I++)
for(J=0,j=25;J<=8;j+=4,J++)
{gotoxy(j,i);if (SDK_a[I][J]==0) printf(" "); else {textcolor(11); cprintf("%d",SDK_a[I][J]); textcolor(WHITE); }}
}
//********************************************
void affich_erreurs()
{
int I,J, i,j;
for(I=0,i=9;I<=8;i+=4,I++)
for(J=0,j=25;J<=8;j+=4,J++)
{ gotoxy(j,i);
if (SDK_j[I][J]!=0)
{if (SDK_j[I][J]!=SDK_s[I][J] ) {textcolor(4); cprintf("%d",SDK_j[I][J]); textcolor(WHITE); }
else printf("%d",SDK_j[I][J]);}
}
}
//********************************************
void copier_tableau(int copie[81])
{
int i;
for (i=0; i<81; i++)
copie[i]=SDK_a[i/9][i%9];
}
//********************
void copier_tab(int SDK[9][9])
{ int i,j;
for(i=0;i<9;i++) // on remplie la matrice par des espaces (la comparaison)
for(j=0;j<9;j++)
SDK[i][j]=SDK_a[i][j];
}
//********************************************
int detect_1_case_vide(int h)
{
if (SDK_copi[h]) return detect_1_case_vide(h+1); // ce n'est pas la 1er case vide , n pass à la suivante
return h;
}
//********************************************
int detect_cv_suiv(int I)
{
if (SDK_copi[I]) return detect_cv_suiv(I+1); // ce n'est pas la case vide , n pass à la suivante
// condition nn verifiée dc sdk_copi[i]=0
return I;
}
//********************************************
int detect_cv_prec(int I)
{
if(SDK_copi[I]) return detect_cv_prec(I-1); // ce n'est pas la case vide , n pass à la suivante
// condition nn verifiée dc sdk_copi[i]=0
return I;
}
////////////////////// Fct Remplissage grille SDK ac des 0 /////////////////////
void remplissage_grille_zeros()
{ int J,I;
for(J=0;J<9;J++) // on remplie la matrice par des espaces (la comparaison)
for(I=0;I<9;I++)
SDK_a[J][I]=0;
}
/////////////////////////////// Fct ctrl region ////////////////////////////////
int ctrl_region(int SDK[9][9],int lig, int col, int val)
{
int lmin,lmax,cmin,cmax,l,c,ok=1;
lmin=lig/3*3; lmax=lmin+3;
cmin=col/3*3; cmax=cmin+3;

for(l=lmin; l<lmax && ok; l++)
for(c=cmin; c<cmax && (ok=(l==lig || c==col) || SDK[l][c]!=val); c++); //on compare pa si il sagi de la meme ligne ou la meme colene deja controlé

return ok; // ok=0 si l'element existe
}
////////////////////////// Fct ctrl lignes & colones ///////////////////////////
int ctrl_lignes_colones(int SDK[9][9], int J, int I, int val)
{
int x;
for(x=0; x<9 && SDK[J][x]!=val && SDK[x][I]!=val; x++);
return x==9; //si x==9 est vraie on retourne 1 (le chiffre k'on vt ajouter n'existe pas)
//sinon on retourne 0
}
/////////////////////////// Fct Resolvante du SUDOKU ///////////////////////////
int resoudre_SDK(int t)
{
int i,j; int icv; // icv indice case vide

if(t<81) // on a pa depasser la tailmle effective du tab sdk_copi
{
i=t/9; j=t%9;

while( (ctrl_lignes_colones(SDK_s,i,j,SDK_s[i][j]+1) && ctrl_region(SDK_s,i,j,SDK_s[i][j]+1))==0)
SDK_s[i][j]++;//on incrémente la valeur de la case tant qu'une valeur ne vérifie pas le test
SDK_s[i][j]++;//on incrémente la valeur car dans le test, on teste pour la valeur au dessus

if(i==(ind_1_cv/9) && j==(ind_1_cv%9) && SDK_s[i][j]==10) //si on est à la première case vide et qu'aucunes valeurs ne convient alors la grille est irrésolvable
{return 0;}

if(SDK_s[i][j]==10)//cas où aucune valeur n'est possible
{
SDK_s[i][j]=0;//on remet à 0 la case qui a atteint le max = 10
icv=detect_cv_prec(t-1); return resoudre_SDK(icv);
}
else {icv=detect_cv_suiv(t+1); return resoudre_SDK(icv); }
}
else return 1;
}
/****************************** Partie Arbitre *********************************/
void partie_arbitre()
{
textcolor(161); gotoxy(35,5); cprintf("Partie Arbitre"); textcolor(WHITE);
gotoxy(3,9); textcolor(38); cprintf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
gotoxy(3,10);cprintf("º OPTIONS Du JEU º");
gotoxy(3,11);cprintf("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ");

gotoxy(4,15); textcolor(53);cprintf("F10: Sauvegarder");

gotoxy(5,18); textcolor(29);cprintf("Echap: Quitter");textcolor(11);
}
/****************************** Partie joueur *********************************/
void partie_joueur()
{
textcolor(161); gotoxy(34,5); cprintf(" Partie Joueur"); textcolor(WHITE);
gotoxy(62,15); cprintf("ASSISTANCE:");
gotoxy(74,15);textcolor(RED);cprintf ("OFF");textcolor(WHITE);

gotoxy(3,8);textcolor(38);cprintf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
gotoxy(3,9);cprintf("º REGLES DE JEU º");
gotoxy(3,10);cprintf("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ");

gotoxy(3,13); textcolor(4);cprintf(" Parcourir grille");
gotoxy(12,15); cprintf("");
gotoxy(11,16);cprintf("  ");
gotoxy(12,17); cprintf("");

gotoxy(3,20); textcolor(60);cprintf("Chiffres autoris‚s");
gotoxy(10,22); cprintf("1 2 3");
gotoxy(10,24); cprintf("4 5 6");
gotoxy(10,26); cprintf("7 8 9");

gotoxy(5,29); textcolor(53);cprintf("F2: Assistance");;
gotoxy(5,33); textcolor(53);cprintf("F3: Mes erreurs");
gotoxy(5,37); textcolor(29);cprintf("F5: Solutions");
gotoxy(5,41); textcolor(29);cprintf("Echap: Quitter");textcolor(11);
}
////////////////////////////////// Fct Grille //////////////////////////////////
void grille()
{
clrscr(); curseur(0); // masquer le curseur
textcolor(11);gotoxy(1,3); textbackground(17); cprintf(" Sudoku "); textbackground(0);

int l=7,c; textcolor(11);

if(joueur) partie_joueur(); else partie_arbitre();
while(l<=43)
{
for(c=24;c<59;)
{
gotoxy(c,l);textbackground(BLUE);cprintf("ÍÍÍ");textbackground(0);
if (l!=43) {gotoxy(c,l+4);cprintf("ÄÄÄ"); gotoxy(c,l+8);cprintf("ÄÄÄ");}
c=c+4;
}
l=l+12;
}
c=23;
while(c<=59)
{
for(l=8;l<42;)
{
gotoxy(c,l);textbackground(BLUE);cprintf("º"); gotoxy(c,l+1);cprintf("º"); gotoxy(c,l+2);cprintf("º"); textbackground(0);
if (c!=59) { gotoxy(c+4,l); cprintf("³"); gotoxy(c+8,l);cprintf("³");
gotoxy(c+4,l+1);cprintf("³");gotoxy(c+8,l+1);cprintf("³");
gotoxy(c+4,l+2);cprintf("³");gotoxy(c+8,l+2);cprintf("³");
}
l=l+4;
}
c=c+12;
}
for(c=27;c<59;)
{
if(c!=35 && c!=47){gotoxy(c,7);textbackground(BLUE);cprintf("Ñ");gotoxy(c,43);cprintf("Ï");}
else {gotoxy(c,7);cprintf("Ë");gotoxy(c,43);cprintf("Ê");}
c=c+4;
}
for(l=11;l<43;)
{ textbackground(BLUE);
if(l!=19 && l!=31) {gotoxy(23,l);cprintf("Ç");gotoxy(59,l);cprintf("¶");}
else {gotoxy(23,l);cprintf("Ì"); gotoxy(59,l);cprintf("¹");} textbackground(0);
l=l+4;
}
for(l=11;l<43;)
{
for(c=27;c<59;)
{
gotoxy(c,l); cprintf("Å"); gotoxy(c+4,l);cprintf("Å");
gotoxy(c,l+4); cprintf("Å"); gotoxy(c+4,l+4);cprintf("Å");
c=c+12;
}
l=l+12;
}
for(l=19;l<43;)
{
for(c=27;c<59;)
{
if (c!=35 && c!=47) {gotoxy(c,l);textbackground(BLUE);cprintf("Ø"); gotoxy(c+4,l);cprintf("Ø");c=c+8;}
else {gotoxy(c,l); cprintf("Î");textbackground(0); c=c+4;}
}
l=l+12;
}
c=35; textbackground(BLUE);
while(c!=59)
{
for(l=11;l<43;)
{
gotoxy(c,l);cprintf("×"); gotoxy(c,l+4);cprintf("×");
l=l+12;
}
c=c+12;
}
gotoxy(23,7);cprintf("É"); gotoxy(59,7);cprintf("»");
gotoxy(23,43);cprintf("È"); gotoxy(59,43);cprintf("¼");textcolor(WHITE);textbackground(0);
}

/*******************************Fct ctrl_touches ******************************/
char ctrl_touche()
{
char c; int cp;
do{ // Boucle de contr“le des touches autoris‚es
cp=0;
fflush(stdin); c=getch();
if(c==0) {c=getch();cp=1;} // on s'assure k'il sagit bien des codes ascii des fleches
}while( ( (c!=80&&c!=72&&c!=75&&c!=77&&(c!=60||!joueur)&&(c!=61||!joueur)&&(c!=63||!joueur) ) || !cp) && (!isdigit(c)||c=='0') && c!=27 && c!=8);
return c;
}
/******************************************************************************/
void stock_valeur_grille(int SDK[9][9],int i,int j,int J,int I,int v)
{
gotoxy(i,j); printf("%d",v);
SDK[J][I]=v; gotoxy(i,j); curseur(1);
}
////////////////////////////// partie traitement ///////////////////////////////
void manipulation(int *J,int *I,int *j,int *i,char c,int *A)
{ int N;
switch(c) //Etude des cas (monter,d‚scendre,aller a droite ou a gauche)
{
case 80 : *j=*j+4;(*J)++; if(*j>41) {*j=9;*J=0;}gotoxy(*i,*j); curseur(1);break;
case 72 : *j=*j-4;(*J)--; if(*j<9) {*j=41;*J=8;}gotoxy(*i,*j); curseur(1);break;
case 77 : *i=*i+4;(*I)++; if(*i>57) {*i=25;*I=0;}gotoxy(*i,*j); curseur(1);break;
case 75 : *i=*i-4;(*I)--; if(*i<25) {*i=57;*I=8;}gotoxy(*i,*j); curseur(1); break;
case 8 : suppression(*i,*j,*J,*I); break;
case 27 : break;
case 63 : copier_tab(SDK_s); ind_1_cv=detect_1_case_vide(0);
N=resoudre_SDK(ind_1_cv); if(N) aff_sol(); else msg(" Cette Grille n'a pas de solution "); break;
case 61 : copier_tab(SDK_s); ind_1_cv=detect_1_case_vide(0); N=resoudre_SDK(ind_1_cv);
affich_erreurs(); gotoxy(*i,*j); curseur(1);break;
case 60 : (*A)++;
if((*A)%2==0) // aide activ‚e
{gotoxy(74,15);textcolor(GREEN);cprintf("ON "); gotoxy(*i,*j);}
else
{gotoxy(74,15);textcolor(RED);cprintf("OFF"); gotoxy(*i,*j);}textcolor(WHITE); break;
default : if((*A)%2==0) // aide activ‚e
{
if(joueur)
{ if (ctrl_lignes_colones(SDK_j,*J,*I,c-'0') && ctrl_region(SDK_j,*J,*I,c-'0') )
stock_valeur_grille(SDK_j,*i,*j,*J,*I,c-'0');
else printf("\a");}
else
{ if( ctrl_lignes_colones(SDK_a,*J,*I,c-'0') && ctrl_region(SDK_a,*J,*I,c-'0') )
stock_valeur_grille(SDK_a,*i,*j,*J,*I,c-'0');
else printf("\a");}
}/*aide desactiv‚e*/
else stock_valeur_grille(SDK_j,*i,*j,*J,*I,c-'0');break;
}
}
//************************** Le Menu deroulant ********************************/
void menu_deroulant(char *v_menu[],int taille_menu,int *pos)
{
int i,cp; char c; clrscr();
do{
for(i=0;i<taille_menu;i++) //Boucle de r‚affichage du menu
{gotoxy(15*(i+1),10*i+10);
if(*pos==i) {textbackground(4);textcolor(14);}cprintf("%10s",v_menu[i]);textcolor(WHITE); textbackground(0); }

do{ // Boucle de contr“le des touches autoris‚es
cp=0;c=getch();
if(c==0) {c=getch();cp=1;}
} while( ((c!=80 && c!=72)|| !cp)&& c!=13 );

switch(c) //Etude des cas (monter ou d‚scendre)
{
case 80 : (*pos)++; if(*pos>taille_menu - 1) *pos=0;break;
case 72 : (*pos)--; if(*pos<0) *pos=taille_menu - 1;break;
}
}while( c!=13);
}
//////////////////////////////// Fct MENU SUDOKU ///////////////////////////////
void menu()
{
char c,*menu[]={" Charger/Jouer "," Creer une grille "," Quitter "};
int position_menu=0;
do{
clrscr(); curseur(0);
menu_deroulant(menu,3,&position_menu);
curseur(1); fflush(stdin);clrscr();
switch(position_menu)
{
case 0 : char c; int A=1; //A boolienne de l'aide
int i=25,j=9 ,J=0, I=0; //i,j indice curseur //I,J indices matrice
if(oui)
{
joueur=1; grille();copier_tab(SDK_j);
affich_sdk_jr(); gotoxy(i,j); curseur(1);
do{
c=ctrl_touche();
manipulation(&J,&I,&j,&i,c,&A);
}while( c!=27);
} else msg(" Auccune grille enregistr‚e "); break;
case 1 : A=0; joueur=0; i=25,j=9 ,J=0, I=0;
remplissage_grille_zeros(); //on remplie la matrice ac des zeros
grille(); gotoxy(i,j); curseur(1);
do{
fflush(stdin); c=ctrl_touche();
manipulation(&J,&I,&j,&i,c,&A);
}while( c!=27); copier_tableau(SDK_copi); oui=1; break;
}
} while(position_menu!=2);
}
/////////////////////////////////// Fct main ///////////////////////////////////
void main()
{
bienvenue();// message de la bienvenue
menu(); //le menu deroulant
}

Répondre à smixx
Collection CommentÇaMarche.net