Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- int sudoku[9][9]={{8,0,0,0,0,0,6,0,0},
- {0,2,9,6,7,0,0,1,0},
- {0,0,0,0,1,4,0,5,0},
- {6,0,0,3,9,1,5,0,2},
- {0,5,1,0,0,0,9,0,0},
- {9,0,2,0,0,6,0,0,0},
- {0,6,0,4,3,0,0,0,0},
- {0,9,0,0,8,7,1,6,0},
- {0,0,7,0,0,0,0,0,3}};
- int tablero[9][9];
- int cont=0;
- void imprimir_sudoku() {
- int x,y;
- for(x=0;x<9;x++) {
- for(y=0;y<9;y++) {
- printf("%d", sudoku[x][y]);
- if(y==2||y==5)
- printf("|");
- }
- printf("\n");
- if(x==2||x==5) {
- printf("---+---+---");
- printf("\n");
- }
- }
- printf("\n");
- cont++;
- }
- void inicializar(int x, int y) {
- int a,b;
- a=x;b=y+1;
- while(a<9) {
- if(tablero[a][b]==0) sudoku[a][b]=0;
- b++;
- if (b>8) { b=0;a++; }
- }
- }
- int comprobar(int x, int y) {
- int a,b,c,correcto,retorno,contador,x2,y2;
- correcto=1;
- for(a=1;a<=9 && correcto;a++) {
- contador=0;
- for(b=0;b<9 && correcto;b++) {
- if(sudoku[x][b]!=0)
- if(sudoku[x][b]==a)
- contador++;
- }
- if (contador>1) correcto=0;
- }
- retorno=correcto;
- if(correcto) {
- for(a=1;a<=9 && correcto;a++) {
- contador=0;
- for(b=0;b<9 && correcto;b++) {
- if(sudoku[b][y]!=0)
- if(sudoku[b][y]==a)
- contador++;
- }
- if(contador>1) correcto=0;
- }
- retorno=correcto;
- }
- if(correcto) {
- for(a=1;a<=9 && correcto;a++) {
- x2=(x-(x % 3));
- y2=(y-(y % 3));
- contador=0;
- for(b=x2;b<x2+3;b++) {
- for(c=y2;c<y2+3;c++) {
- if(sudoku[b][c]!=0)
- if(sudoku[b][c]==a)
- contador++;
- }
- }
- if(contador>1) correcto=0;
- }
- retorno=correcto;
- }
- return retorno;
- }
- int resolver_sudoku(int x, int y) {
- int a, correcto;
- if (y>8) { y=0;x++; }
- while(x<9 && tablero[x][y]!=0) {
- y++;
- if (y>8) { y=0;x++; }
- }
- if(x==9) {
- if(!comprobar(8, 8)) {
- printf("Sin solucion");
- exit(-1);
- } else {
- imprimir_sudoku();
- }
- } else {
- for(a=1;a<=9;a++) {
- inicializar(x,y);
- sudoku[x][y]=a;
- correcto=comprobar(x,y);
- if(correcto)
- resolver_sudoku(x,y+1);
- else
- sudoku[x][y]=0;
- }
- }
- }
- int main() {
- int x,y,correcto;
- for(x=0;x<9;x++)
- for(y=0;y<9;y++)
- tablero[x][y]=sudoku[x][y];
- correcto=1;
- for(x=0;x<9 && correcto;x++)
- for(y=0;y<9 && correcto;y++) {
- correcto=comprobar(x,y);
- }
- if(!correcto)
- printf("Datos de entrada incorrectos\n");
- else
- resolver_sudoku(0,0);
- printf("Combinaciones : %d\n", cont);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement