Advertisement
M1RAI

sudoku

Jan 5th, 2021
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.90 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define MIN 3
  6.  
  7. #define MAX 9
  8.  
  9. #define FAUX 0
  10. #define VRAI 1
  11.  
  12. char grille[MAX][MAX];
  13. long int g_comp_tests;
  14. int g_flag_affiche;
  15.  
  16. int main(int argc, char *argv[]);
  17. int parametre_affichage(char t[]);
  18.  
  19. int saisie_grille(void);
  20. int saisie_une_ligne(int ligne);
  21. int verif_saisie_grille(void);
  22. int verif_saisie_lignes(void);
  23. int verif_saisie_une_ligne(int ligne);
  24. int verif_saisie_colonnes(void);
  25. int verif_saisie_une_colonne(int col);
  26. int verif_saisie_carres(void);
  27. int verif_saisie_un_carre(int carre);
  28. void trans_carre(char tamp[], int carre);
  29.  
  30. void resolve(void);
  31. int case_dispo_nbre(int nbre, int ligne, int col);
  32. void trans_carre_de_case(char tamp[], int ligne, int col);
  33.  
  34. void affiche_grille_attente(void);
  35. void affiche_grille(void);
  36. void affiche_chaine(int nbre);
  37. int grille_finie(void);
  38. void attente(void);
  39.  
  40.  
  41. int main(int argc, char *argv[])
  42.  
  43. {
  44.  
  45.   g_flag_affiche = ((argc>= 2) && (parametre_affichage(argv[1])));
  46.   /**********/
  47.   printf("\n******* SUDOKU *******\n\n");
  48.    printf("l'option sudoku -a affiche la resolution case par case.\n\n");
  49.   printf("Saisissez %d lignes de %d chiffres,\n", MAX, MAX);
  50.   printf("les chiffres peuvent etre separes par n'importe quels caracteres\n");
  51.   printf("Rentrez un 0 pour chaque case vide.\n");
  52.  printf("Pour quitter le programme, valider la lettre Q.\n\n");
  53.  while (saisie_grille()) {
  54.  g_comp_tests = 0;
  55.  resolve();
  56.  affiche_grille();
  57.  if (! grille_finie()) printf("Enonce errone...\n");
  58.   printf("Tests : %ld\n\n", g_comp_tests);
  59.   }
  60.  printf("\n");
  61.  return 0;
  62. }
  63.  
  64.  
  65. int parametre_affichage(char t[])
  66.  
  67. {
  68.  
  69.   char param;
  70.    if (strlen(t) == 1) param = t[0];
  71.    else if (strlen(t) == 2) param = t[1];
  72.    else param = 0;
  73.    return ((param == 'A') || (param == 'a'));
  74. }
  75.  
  76.  
  77. int saisie_grille(void)
  78.  
  79. {
  80.    int ligne;
  81.    printf("Saisissez votre grille : \n");
  82.    while (VRAI){
  83.   for (ligne = 0; ligne < MAX; ligne++){
  84.    if (! saisie_une_ligne(ligne)) return (FAUX);
  85.    }
  86.    printf("\nEnonce : \n");
  87.   affiche_grille();
  88.   if (verif_saisie_grille()) return(VRAI);
  89.   else printf("\n");
  90.    }
  91. }
  92.  
  93.  
  94. int saisie_une_ligne(int ligne)
  95.  
  96. {
  97.  
  98.    int c, i;
  99.    int col = 0;
  100.    int result = VRAI;
  101.  
  102.    for (i = 0; i < MAX; i++) {
  103.    grille[ligne][i] = 0;
  104.    }
  105.  
  106.    printf("Ligne %d : ", ligne+1);
  107.    while(VRAI){
  108.     c = fgetc(stdin);
  109.       if (c == feof(stdin) || c == 0x0A) return result;
  110.       else if ((c == 'Q') || (c == 'q')) result = FAUX;
  111.  
  112.    else if ( (result) && (col < MAX) && (c >= '0') && (c <= '9')) {
  113.   grille[ligne][col++] = c-48;
  114.   }
  115.   }
  116. }
  117.  
  118.  
  119. int verif_saisie_grille(void)
  120.  
  121. {
  122.    int result = VRAI;
  123.    if (! verif_saisie_lignes()) result = FAUX;
  124.    if (! verif_saisie_colonnes()) result = FAUX;
  125.    if (! verif_saisie_carres()) result = FAUX;
  126.    return result;
  127. }
  128.  
  129.  
  130. int verif_saisie_lignes(void)
  131.  
  132. {
  133.    int ligne;
  134.    int result = VRAI;
  135.    for (ligne = 0; ligne < MAX; ligne++) {
  136.      if (! verif_saisie_une_ligne(ligne)) result = FAUX;
  137.    }
  138.    return result;
  139. }
  140.  
  141.  
  142. int verif_saisie_une_ligne(int ligne)
  143.  
  144. {
  145.    int i,j;
  146.   for (i = 0; i < MAX-1; i++) {
  147.   if ( grille[ligne][i] == 0 ) continue;
  148.    for (j = i+1; j < MAX; j++) {
  149.    if (grille[ligne][i] == grille[ligne][j]) {
  150.   printf("Erreur ligne %d : chiffres egaux\n", ligne+1);
  151.    return FAUX;
  152.    }
  153.   }
  154.    }
  155.   return VRAI;
  156. }
  157.  
  158.  
  159. int verif_saisie_colonnes(void)
  160.  
  161. {
  162.   int col;
  163.   int result = VRAI;
  164.    for (col = 0; col < MAX; col++) {
  165.   if (! verif_saisie_une_colonne(col)) result = FAUX;
  166.    }
  167.    return result;
  168. }
  169.  
  170.  
  171. int verif_saisie_une_colonne(int col)
  172.  
  173. {
  174.    int i, j;
  175.    for (i = 0; i < MAX-1; i++) {
  176.   if ( grille[i][col] == 0 ) continue;
  177.  for (j = i+1; j < MAX; j++) {
  178.    if (grille[i][col] == grille[j][col]) {
  179.   printf("Erreur colonne %d : chiffres egaux\n", col+1);
  180.    return FAUX;
  181.   }
  182.    }
  183.    }
  184.    return VRAI;
  185. }
  186.  
  187.  
  188. int verif_saisie_carres(void)
  189.  
  190. {
  191.    int carre;
  192.    int result = VRAI;
  193.    for (carre = 0; carre < MAX; carre++) {
  194.       if (! verif_saisie_un_carre(carre)) result = FAUX;
  195.    }
  196.    return result;
  197. }
  198.  
  199.  
  200. int verif_saisie_un_carre(int carre)
  201.  
  202. {
  203.   char tamp[MAX+10];
  204.    int i, j;
  205.    trans_carre(tamp, carre);
  206.    for (i = 0; i < MAX-1; i++) {
  207.   if (tamp[i] == 0 ) continue;
  208.    for (j = i+1; j < MAX; j++) {
  209.   if (tamp[i] == tamp[j]) {
  210.   printf("Erreur carre %d : chiffres egaux\n", carre+1);
  211.   return FAUX;
  212.   }
  213.   }
  214.   }
  215.    return VRAI;
  216. }
  217.  
  218.  
  219. void trans_carre(char tamp[], int carre)
  220.  
  221. {
  222.    int i,j, x,y,z;
  223.    x = (((carre) % MIN)*MIN);
  224.    y = (((carre+MIN) / MIN)*MIN)-MIN;
  225.    z = 0;
  226.    for (j = y; j < y+MIN; j++) {
  227.       for (i = x; i < x+MIN; i++) {
  228.          tamp[z++] = grille[j][i];
  229.       }
  230.    }
  231. }
  232.  
  233.  
  234.  
  235.  
  236. void resolve(void)
  237.  
  238. {
  239.    int ligne, col, nbre, nbre_tamp;
  240.    for (ligne = 0; ligne < MAX; ligne++) {
  241.    for (col = 0; col < MAX; col++) {
  242.    if (grille[ligne][col]) continue;
  243.    for (nbre = 1; nbre <= MAX; nbre++) {
  244.   if (! case_dispo_nbre(nbre, ligne, col)) continue;
  245.    nbre_tamp = grille[ligne][col];
  246.    grille[ligne][col] = nbre;
  247.    g_comp_tests++;
  248.   if (g_flag_affiche) affiche_grille_attente();
  249.    resolve();
  250.    if (grille_finie()) return;
  251.  
  252.    grille[ligne][col] = nbre_tamp;
  253.   }
  254.   return;
  255.   }
  256.    }
  257.    return;
  258. }
  259.  
  260.  
  261. int case_dispo_nbre(int nbre, int ligne, int col)
  262.  
  263. {
  264.  
  265.    char tamp[MAX+10];
  266.    int i;
  267.  
  268.    for (i = 0; i < MAX; i++) if (grille[ligne][i] == nbre) return(FAUX);
  269.  
  270.    for (i = 0; i < MAX; i++) if (grille[i][col] == nbre) return(FAUX);
  271.  
  272.    trans_carre_de_case(tamp, ligne, col);
  273.    for (i = 0; i < MAX; i++) if (tamp[i] == nbre) return (FAUX);
  274.  
  275.    return(VRAI);
  276. }
  277.  
  278.  
  279. void trans_carre_de_case(char tamp[], int ligne, int col)
  280.  
  281. {
  282.    int i, j, k;
  283.    while ((ligne % MIN) != 0) ligne--;
  284.    while ((col % MIN) != 0) col--;
  285.    k = 0;
  286.    for (j = ligne; j < ligne+MIN; j++) {
  287.       for (i = col; i < col+MIN; i++) {
  288.         tamp[++k] = grille[j][i];
  289.       }
  290.    }
  291. }
  292.  
  293.  
  294.  
  295.  
  296. void affiche_grille_attente(void)
  297.  
  298. {
  299.    affiche_grille();
  300.    printf("%ld, Touche entree pour la suite...", g_comp_tests);
  301.    attente();
  302. }
  303.  
  304. void affiche_grille(void)
  305.  
  306. {
  307.    int ligne, col;
  308.    for (ligne = 0; ligne < MAX; ligne++) {
  309.       for (col = 0; col < MAX; col++) {
  310.         printf(" %1d ", grille[ligne][col]);
  311.        if ( ((col % MIN) == MIN-1) && (col < MAX-1) ) {
  312.             printf(" | ");
  313.          }
  314.       }
  315.       printf("\n");
  316.       if ( ((ligne % MIN) == MIN-1) && (ligne < MAX-1) ) {
  317.       affiche_chaine(33);
  318.       }
  319.    }
  320.   printf("\n");
  321. }
  322.  
  323.  
  324. void affiche_chaine(int nbre)
  325.  
  326. {
  327.    int i;
  328.    for (i = 1; i <= nbre; i++) {
  329.       printf("*");
  330.    }
  331.    printf("\n");
  332. }
  333.  
  334.  
  335. int grille_finie(void)
  336.  
  337. {
  338.    int ligne, col;
  339.   for (ligne = MAX-1; ligne >= 0; ligne--) {
  340.    for (col = MAX-1; col >= 0; col--) {
  341.    if (grille[ligne][col] == 0 ) {
  342.    return FAUX;
  343.   }
  344.   }
  345.   }
  346.    return VRAI;
  347. }
  348.  
  349.  
  350. void attente(void)
  351.  
  352. {
  353.    char c;
  354.   while(VRAI){
  355.     c = fgetc(stdin);
  356.   if (c == feof(stdin) || c == 0x0A) return;
  357.   }
  358. }
  359.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement