Advertisement
Guest User

sudoku

a guest
Mar 26th, 2020
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int sudoku[9][9]={{8,0,0,0,0,0,6,0,0},
  5.           {0,2,9,6,7,0,0,1,0},
  6.           {0,0,0,0,1,4,0,5,0},
  7.           {6,0,0,3,9,1,5,0,2},
  8.           {0,5,1,0,0,0,9,0,0},
  9.           {9,0,2,0,0,6,0,0,0},
  10.           {0,6,0,4,3,0,0,0,0},
  11.           {0,9,0,0,8,7,1,6,0},
  12.           {0,0,7,0,0,0,0,0,3}};
  13.    
  14.    
  15. int tablero[9][9];
  16.  
  17. int cont=0;
  18.  
  19. void imprimir_sudoku() {
  20.     int x,y;
  21.     for(x=0;x<9;x++) {
  22.         for(y=0;y<9;y++) {
  23.             printf("%d", sudoku[x][y]);
  24.             if(y==2||y==5)
  25.                 printf("|");
  26.         }
  27.         printf("\n");
  28.         if(x==2||x==5) {
  29.             printf("---+---+---");
  30.             printf("\n");
  31.         }
  32.     }
  33.     printf("\n");
  34.  
  35.     cont++;
  36. }
  37.  
  38. void inicializar(int x, int y) {
  39.     int a,b;
  40.     a=x;b=y+1;
  41.     while(a<9) {
  42.         if(tablero[a][b]==0) sudoku[a][b]=0;
  43.         b++;
  44.         if (b>8) { b=0;a++; }
  45.     }
  46. }
  47.  
  48.  
  49. int comprobar(int x, int y) {
  50.     int a,b,c,correcto,retorno,contador,x2,y2;
  51.  
  52.     correcto=1;
  53.     for(a=1;a<=9 && correcto;a++) {
  54.         contador=0;
  55.         for(b=0;b<9 && correcto;b++) {
  56.             if(sudoku[x][b]!=0)
  57.                 if(sudoku[x][b]==a)
  58.                     contador++;
  59.         }
  60.         if (contador>1) correcto=0;
  61.     }
  62.    
  63.     retorno=correcto;
  64.    
  65.     if(correcto) {
  66.         for(a=1;a<=9 && correcto;a++) {
  67.             contador=0;
  68.             for(b=0;b<9 && correcto;b++) {
  69.                 if(sudoku[b][y]!=0)
  70.                     if(sudoku[b][y]==a)
  71.                         contador++;
  72.             }
  73.             if(contador>1) correcto=0;
  74.         }
  75.         retorno=correcto;
  76.     }
  77.  
  78.     if(correcto) {
  79.         for(a=1;a<=9 && correcto;a++) {
  80.             x2=(x-(x % 3));
  81.             y2=(y-(y % 3));
  82.             contador=0;
  83.             for(b=x2;b<x2+3;b++) {
  84.                 for(c=y2;c<y2+3;c++) {
  85.                     if(sudoku[b][c]!=0)
  86.                         if(sudoku[b][c]==a)
  87.                             contador++;
  88.                 }
  89.             }
  90.             if(contador>1) correcto=0;
  91.         }
  92.         retorno=correcto;
  93.     }
  94.    
  95.     return retorno;
  96. }
  97.  
  98. int resolver_sudoku(int x, int y) {
  99.     int a, correcto;
  100.    
  101.     if (y>8) { y=0;x++; }
  102.     while(x<9 && tablero[x][y]!=0) {
  103.         y++;
  104.         if (y>8) { y=0;x++; }
  105.     }
  106.     if(x==9) {
  107.         if(!comprobar(8, 8)) {
  108.             printf("Sin solucion");
  109.             exit(-1);
  110.         } else {
  111.             imprimir_sudoku();
  112.         }
  113.     } else {
  114.         for(a=1;a<=9;a++) {
  115.             inicializar(x,y);
  116.             sudoku[x][y]=a;
  117.             correcto=comprobar(x,y);
  118.             if(correcto)
  119.                 resolver_sudoku(x,y+1);
  120.             else
  121.                 sudoku[x][y]=0;
  122.         }
  123.     }
  124. }
  125.  
  126. int main() {
  127.     int x,y,correcto;
  128.     for(x=0;x<9;x++)
  129.         for(y=0;y<9;y++)
  130.             tablero[x][y]=sudoku[x][y];
  131.  
  132.     correcto=1;
  133.     for(x=0;x<9 && correcto;x++)
  134.         for(y=0;y<9 && correcto;y++) {
  135.             correcto=comprobar(x,y);
  136.         }
  137.  
  138.    
  139.     if(!correcto)
  140.         printf("Datos de entrada incorrectos\n");
  141.     else
  142.         resolver_sudoku(0,0);
  143.    
  144.     printf("Combinaciones : %d\n", cont);
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement