Code Source Sudoku En C
Commentaires Composés : Code Source Sudoku En C. Recherche parmi 300 000+ dissertationsPar dissertation • 30 Mars 2014 • 3 111 Mots (13 Pages) • 1 009 Vues
#include <stdio.h>
#include <stdlib.h>
#define E_OK 0 /* TOUT VA POUR LE MIEU */
#define E_MAUVAISE_LIGNE 1 /* LIGNE HORS L'INTERVAL [0,8] */
#define E_MAUVAISE_COLONE 2 /* COLONE HORS L'INTERVAL [0,8] */
#define E_NUM_EXIST 3 /* NUM EXISTE DEJA SUR LA MÊME LIGNE,COLONE,OU RÉGION */
#define E_RESOLU 4 /* GRILLE RESOLUE */
#define E_POSSIBILITES_MANQUANTES 5 /* !!! FAUSSE GRILLE !!! */
#define T_MAX 9 /* DIMENSION DE LA GRILLE */
typedef unsigned short CodeCase;
int grille[T_MAX][T_MAX];/* * Matrice qui va contenir la grille aprés lecture du fichier,
ainsi que le val_retourat final apres resolution dans le cas où
la grille n'est pas fausse
/
/**
Fonction qui lit une grille à partir d'un fichier txt
/
void lire_grille(char * chemin) {
int i,j;
FILE * source;
source = fopen(chemin,"r");
for (i = 0; i < T_MAX; i++)
{
for(j= 0; j < T_MAX; j++)
{
fscanf(source,"%d",&grille[i][j]);
}
}
fclose(source);
}
/**
Fonction qui initialise toutes les cases la matrice T_MAXxT_MAX representant la grille à 0
/
void zero_matrice( int a[T_MAX][T_MAX] ) {
int ligne, col;
for ( ligne = 0; ligne < T_MAX; ligne++ )
for ( col = 0; col < T_MAX; col++ ) a[ligne][col] = 0;
}
/**
Crée un mask à partir d'un des numéros de la grille passé en parametre
puis l'applique à la grille contenant les CodeCases equivallents à chacun
des composants, en faisant un OU (OR) logique bit par bit avec l'ancienne
valeur contenue dans la case p[ligne][col]
/
void set_possible( CodeCase p[T_MAX][T_MAX], int ligne, int col, int num ) {
CodeCase mask;
mask = 1 << ( num - 1 );
p[ligne][col] |= mask;
}
/**
Crée un mask à partir d'un des numéros de la grille passé en parametre
puis l'applique à la grille contenant les CodeCases equivallents à chacun
des composants, en faisant un ET (AND) logique bit par bit avec l'ancienne
valeur contenue dans la case p[ligne][col] et le complement à un du mask
calculé
/
void set_impossible( CodeCase p[T_MAX][T_MAX], int ligne, int col, int num ) {
CodeCase mask;
mask = 1 << ( num - 1 );
p[ligne][col] &= ~mask;
}
/**
Calcul un mask à partir d'un numéro passé en parametre pour faire un ET logique
entre ce dernier et le CodeCase p[ligne][col] ainsi on peut savoir si la case
(ligne,col) de la grille peut prendre la valeur num (on retourne 1)
ou pas(on retourne 0)
/
int est_possible(CodeCase p[T_MAX][T_MAX], int ligne, int col, int num ) {
CodeCase mask;
mask = 1 << ( num - 1 );
if ( p[ligne][col] & mask ) return( 1 );
return ( 0 );
}
/**
fonction qui retourne le nombre de possiblilité que peut prendre la case
p[ligne][col], ce qui correspond au poid binaire,
N.B. On travaille sur la partie basse des 2 octets
/
int poidbinaire( CodeCase p[T_MAX][T_MAX], int ligne, int col ) {
CodeCase mask;
int compt;
compt = 0;
mask = 1 << 8;
while( mask )
{
if ( mask & p[ligne][col] ) compt++;
mask >>= 1;
}
return( compt );
}
/**
Regles des Candidats double appliquée aux lignes
/
void l_candidat_double(CodeCase p[T_MAX][T_MAX])
...