Intro facultatif : "Je m'appelle Achraf étudiant en 1ére année du cycle d'ingénieur informatique,,,comment toujours, un module de programmation C nous a été présenté et maintenant c'est le tour de mini-projet C"
Je doit réaliser un programme qui peut résoudre une grille de sudoku,, "c'est l'idée principale car aprés il y aura des optimisations et d'ajout d'autre fonction au programme, par exemple: générer une grille,enregistrer vers une fichier,choisir des mode de difficultés....etc"
j'ai commencé par créer un menu principale pour donner une idée sur les fonctions nécessaires:
/**---------------------------------------------**\
|* Mini-projet: programmation C *|
|* sujet: Sudoku *|
|* Elaboré par: Achraf Noomane *|
|* Med Anis Harrak *|
|* *|
\**---------------------------------------------**/
#include<stdio.h>
#include<conio.h> //définir les bibliothèque
#include<windows.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define err_f "\n\n erreur d'ouverture de fichier!!!"
#define err_in "\n\n erreur d'entree!! verifier svp!!"
/*________________ définir des cst & var______________________________________*/
int n;
FILE *f;
typedef struct {
int tab[9];
int taille_tab;
int solution;
}cellule;
/* _________________fonction(1): initialiser la matrice à zero _______________*/
void initialiser_grid(cellule grid[10][10]) {
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
grid[i][j].solution=FALSE;
}
}
}
/* ___________________________________________________________________________*/
/* ________________fonction(2):Saisie de valeur init par utilisateur _________*/
void saisie_grid(cellule grid[10][10]) {
int i,j,k,solution_temp;
printf("\n\n\n Veuillez entrer les valeurs initiales de votre Sudoku!!!!\n");
printf("le saisie est de la forme suivante");
printf(":\t<Num ligne> espace <Num colonne> espace <valeur de cellule>\n");
printf("pour signaler la fin de la saisie entrer la combinaison <0> <0> <0>\n");
for(k=0;k<81;k++)
{
/*logiquement la saisie ne peut pas dépasser 81 valeur ("taille max de Sudoku")*/
scanf("%d %d",&i,&j);
scanf("%d",&solution_temp);
if(i==0 && j==0 && solution_temp==0)
break; //désigne la fin de la saisie de valeurs
grid[i][j].solution=solution_temp;
}
}
/*____________________________________________________________________________*/
/*_______________________fonction resolution _________________________________*/
//Not yet
/*____________________________________________________________________________*/
//Not yet
/* _____________________fonction(3):affichage ________________________________*/
//Not yet
/* ________________Programme principale ______________________________________*/
void main()
{
char choix;
cellule grid[10][10];
clrscr();
printf("******* Sudoku *******");
getch();
do{
clrscr();
printf("\n\tMENU");
printf("\n\n 1. Resoudre une Sudoku");
printf("\n\n 2. Enregistrer une Sudoku & solution");
printf("\n\n 3. Generer une sudoku");
printf("\n\n 4. Changer les parametres");
printf("\n\n 5. Credits");
printf("\n\n 6. Exit");
printf("\n\nEnter votre choix : ");
scanf("%d",&choix);
clrscr();
switch(choix)
{
case 1:
/*
étape 1: saisie des valeurs présenter pas l'utilisateur */
saisie_grid(grid);
break;
case 2:
/*ip_storesudoku();
break; */
case 3:
/* l'application génére une sodoku */
case 4:
/* change_settings();
break; */
case 5:
clrscr();
printf("___________credit_______________\n");
Sleep(650);
printf("\n\n\nCreated By :Achraf Noomane & Med Anis Harrak");
Sleep(650);
printf("\n\nCopyright 2008 - Esprit *3B1 info ");
Sleep(650);
printf("\n\n Mail : dima_online@hotmail.com");
Sleep(650);
do
{n=random(10);} while(!n);
printf("%d",n);
getch();
break;
case 6:
break;
default:
printf("\a%s",err_in);
getch();
}
}while(choix!=6);
}
pas la peine de me dire, je sais c'est rien du tout ce que j'ai écrit mais bon,,, j'aime sentir que j'ai fait quelque chose comme même,,,aller au sérieux !!!!! (:-)
SVP quelque moment de concentration avec moi :::
mon algorithme consiste à:: crée une grille de structure ""Cellule"" dont chacune contient un tableau contenant tous les valeurs de [1..9],variable taille_tableau,,,et une dernière qui s'appelle solution... le principe c'est parcourir ligne par ligne puis colonne par colonne toute la grille de cellule, chaque cellule où son champ de (cellule.solution==0) on élimine du tableau (cellule.tab) tous les valeurs de solution des cellules dans le même ligne et le même colonne et la même région.
/*=================================================================*/
/* fonction pour verifier les différentes possibilités par ligne */
/*=================================================================*/
void possibilite_ligne(int i,int j,sudoku grille)
{
int k;
for (k=0;k<9;k++)
{
if(grille[i][k].solution!=0)
{
/* c'est une fonciton qui élimine un valeur du tableau s'il existe et décrémente la taille du tableau afin de réduire la possibilité des solutions possible*/
supprimer_val_d1tableau(grille[i][j].taille_tableau,grille[i][j].tab,grille[i][k].solution);
}
}
}
meme principe avec le parcours verticale c-a-d dans un colonne, il suffit de changer grille[i][k] par grille[k][j].
/*=================================================================*/
/* fonction pour verifier les différentes possibilités par region */
/*=================================================================*/
void possibilite_region(int i,int j,sudoku grille)
{
int k,l,pos_ligne,pos_colonne;
if((0<=i)&&(i<=2))
{
pos_ligne=0;
}
if((3<=i)&&(i<=5))
{
pos_ligne=3;
}
if((6<=i)&&(i<=8))
{
pos_ligne=6;
}
if((0<=j)&&(j<=2))
{
pos_colonne=0;
}
if((3<=j)&&(j<=5))
{
pos_colonne=3;
}
if((6<=j)&&(j<=8))
{
pos_colonne =6;
}
for(k=pos_ligne;k<(pos_ligne+3);k++)
{
for(l=pos_colonne;l<(pos_colonne+3);l++)
{
if(grille[k][l].solution!=0)
{
supprimer_val_d1tableau(grille[i][j].taille_tableau,grille[i][j].tab,grille[k][l].solution);
}
}
}
}
Remarque: tous ces fonctions ne sont pas définitive et j'aime bien quand me corrige ou commenter mon travaille pour optimiser ou de prévenir des éventuelles bugs..
ce que j'ai pas vraiment trouvé ces comment mettre tous ça dans des boucles pour résoudre le sudoku surtout surtout comment choisir des valeurs aléatoires dans le cas ou le Sudoku admet plusieurs solutions.. Mon professeur encadreur ma parler du technique de backtracking!!! I have no idea.aussi la fonction affichage d'une grille c'est pas évident du tout...merci pour votre attention..
