Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #define MIN 3
- #define MAX 9
- #define FAUX 0
- #define VRAI 1
- char grille[MAX][MAX];
- long int g_comp_tests;
- int g_flag_affiche;
- int main(int argc, char *argv[]);
- int parametre_affichage(char t[]);
- int saisie_grille(void);
- int saisie_une_ligne(int ligne);
- int verif_saisie_grille(void);
- int verif_saisie_lignes(void);
- int verif_saisie_une_ligne(int ligne);
- int verif_saisie_colonnes(void);
- int verif_saisie_une_colonne(int col);
- int verif_saisie_carres(void);
- int verif_saisie_un_carre(int carre);
- void trans_carre(char tamp[], int carre);
- void resolve(void);
- int case_dispo_nbre(int nbre, int ligne, int col);
- void trans_carre_de_case(char tamp[], int ligne, int col);
- void affiche_grille_attente(void);
- void affiche_grille(void);
- void affiche_chaine(int nbre);
- int grille_finie(void);
- void attente(void);
- int main(int argc, char *argv[])
- {
- g_flag_affiche = ((argc>= 2) && (parametre_affichage(argv[1])));
- /**********/
- printf("\n******* SUDOKU *******\n\n");
- printf("l'option sudoku -a affiche la resolution case par case.\n\n");
- printf("Saisissez %d lignes de %d chiffres,\n", MAX, MAX);
- printf("les chiffres peuvent etre separes par n'importe quels caracteres\n");
- printf("Rentrez un 0 pour chaque case vide.\n");
- printf("Pour quitter le programme, valider la lettre Q.\n\n");
- while (saisie_grille()) {
- g_comp_tests = 0;
- resolve();
- affiche_grille();
- if (! grille_finie()) printf("Enonce errone...\n");
- printf("Tests : %ld\n\n", g_comp_tests);
- }
- printf("\n");
- return 0;
- }
- int parametre_affichage(char t[])
- {
- char param;
- if (strlen(t) == 1) param = t[0];
- else if (strlen(t) == 2) param = t[1];
- else param = 0;
- return ((param == 'A') || (param == 'a'));
- }
- int saisie_grille(void)
- {
- int ligne;
- printf("Saisissez votre grille : \n");
- while (VRAI){
- for (ligne = 0; ligne < MAX; ligne++){
- if (! saisie_une_ligne(ligne)) return (FAUX);
- }
- printf("\nEnonce : \n");
- affiche_grille();
- if (verif_saisie_grille()) return(VRAI);
- else printf("\n");
- }
- }
- int saisie_une_ligne(int ligne)
- {
- int c, i;
- int col = 0;
- int result = VRAI;
- for (i = 0; i < MAX; i++) {
- grille[ligne][i] = 0;
- }
- printf("Ligne %d : ", ligne+1);
- while(VRAI){
- c = fgetc(stdin);
- if (c == feof(stdin) || c == 0x0A) return result;
- else if ((c == 'Q') || (c == 'q')) result = FAUX;
- else if ( (result) && (col < MAX) && (c >= '0') && (c <= '9')) {
- grille[ligne][col++] = c-48;
- }
- }
- }
- int verif_saisie_grille(void)
- {
- int result = VRAI;
- if (! verif_saisie_lignes()) result = FAUX;
- if (! verif_saisie_colonnes()) result = FAUX;
- if (! verif_saisie_carres()) result = FAUX;
- return result;
- }
- int verif_saisie_lignes(void)
- {
- int ligne;
- int result = VRAI;
- for (ligne = 0; ligne < MAX; ligne++) {
- if (! verif_saisie_une_ligne(ligne)) result = FAUX;
- }
- return result;
- }
- int verif_saisie_une_ligne(int ligne)
- {
- int i,j;
- for (i = 0; i < MAX-1; i++) {
- if ( grille[ligne][i] == 0 ) continue;
- for (j = i+1; j < MAX; j++) {
- if (grille[ligne][i] == grille[ligne][j]) {
- printf("Erreur ligne %d : chiffres egaux\n", ligne+1);
- return FAUX;
- }
- }
- }
- return VRAI;
- }
- int verif_saisie_colonnes(void)
- {
- int col;
- int result = VRAI;
- for (col = 0; col < MAX; col++) {
- if (! verif_saisie_une_colonne(col)) result = FAUX;
- }
- return result;
- }
- int verif_saisie_une_colonne(int col)
- {
- int i, j;
- for (i = 0; i < MAX-1; i++) {
- if ( grille[i][col] == 0 ) continue;
- for (j = i+1; j < MAX; j++) {
- if (grille[i][col] == grille[j][col]) {
- printf("Erreur colonne %d : chiffres egaux\n", col+1);
- return FAUX;
- }
- }
- }
- return VRAI;
- }
- int verif_saisie_carres(void)
- {
- int carre;
- int result = VRAI;
- for (carre = 0; carre < MAX; carre++) {
- if (! verif_saisie_un_carre(carre)) result = FAUX;
- }
- return result;
- }
- int verif_saisie_un_carre(int carre)
- {
- char tamp[MAX+10];
- int i, j;
- trans_carre(tamp, carre);
- for (i = 0; i < MAX-1; i++) {
- if (tamp[i] == 0 ) continue;
- for (j = i+1; j < MAX; j++) {
- if (tamp[i] == tamp[j]) {
- printf("Erreur carre %d : chiffres egaux\n", carre+1);
- return FAUX;
- }
- }
- }
- return VRAI;
- }
- void trans_carre(char tamp[], int carre)
- {
- int i,j, x,y,z;
- x = (((carre) % MIN)*MIN);
- y = (((carre+MIN) / MIN)*MIN)-MIN;
- z = 0;
- for (j = y; j < y+MIN; j++) {
- for (i = x; i < x+MIN; i++) {
- tamp[z++] = grille[j][i];
- }
- }
- }
- void resolve(void)
- {
- int ligne, col, nbre, nbre_tamp;
- for (ligne = 0; ligne < MAX; ligne++) {
- for (col = 0; col < MAX; col++) {
- if (grille[ligne][col]) continue;
- for (nbre = 1; nbre <= MAX; nbre++) {
- if (! case_dispo_nbre(nbre, ligne, col)) continue;
- nbre_tamp = grille[ligne][col];
- grille[ligne][col] = nbre;
- g_comp_tests++;
- if (g_flag_affiche) affiche_grille_attente();
- resolve();
- if (grille_finie()) return;
- grille[ligne][col] = nbre_tamp;
- }
- return;
- }
- }
- return;
- }
- int case_dispo_nbre(int nbre, int ligne, int col)
- {
- char tamp[MAX+10];
- int i;
- for (i = 0; i < MAX; i++) if (grille[ligne][i] == nbre) return(FAUX);
- for (i = 0; i < MAX; i++) if (grille[i][col] == nbre) return(FAUX);
- trans_carre_de_case(tamp, ligne, col);
- for (i = 0; i < MAX; i++) if (tamp[i] == nbre) return (FAUX);
- return(VRAI);
- }
- void trans_carre_de_case(char tamp[], int ligne, int col)
- {
- int i, j, k;
- while ((ligne % MIN) != 0) ligne--;
- while ((col % MIN) != 0) col--;
- k = 0;
- for (j = ligne; j < ligne+MIN; j++) {
- for (i = col; i < col+MIN; i++) {
- tamp[++k] = grille[j][i];
- }
- }
- }
- void affiche_grille_attente(void)
- {
- affiche_grille();
- printf("%ld, Touche entree pour la suite...", g_comp_tests);
- attente();
- }
- void affiche_grille(void)
- {
- int ligne, col;
- for (ligne = 0; ligne < MAX; ligne++) {
- for (col = 0; col < MAX; col++) {
- printf(" %1d ", grille[ligne][col]);
- if ( ((col % MIN) == MIN-1) && (col < MAX-1) ) {
- printf(" | ");
- }
- }
- printf("\n");
- if ( ((ligne % MIN) == MIN-1) && (ligne < MAX-1) ) {
- affiche_chaine(33);
- }
- }
- printf("\n");
- }
- void affiche_chaine(int nbre)
- {
- int i;
- for (i = 1; i <= nbre; i++) {
- printf("*");
- }
- printf("\n");
- }
- int grille_finie(void)
- {
- int ligne, col;
- for (ligne = MAX-1; ligne >= 0; ligne--) {
- for (col = MAX-1; col >= 0; col--) {
- if (grille[ligne][col] == 0 ) {
- return FAUX;
- }
- }
- }
- return VRAI;
- }
- void attente(void)
- {
- char c;
- while(VRAI){
- c = fgetc(stdin);
- if (c == feof(stdin) || c == 0x0A) return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement