标签:
1 #include <stdio.h> 2 3 #define false (0) 4 #define true (1) 5 6 int sudoku[9][9]={ 7 0, 7, 1, 0, 5, 9, 0, 0, 4, 8 2, 0, 0, 0, 0, 0, 0, 0, 0, 9 0, 4, 0, 7, 0, 0, 6, 0, 0, 10 0, 0, 0, 5, 1, 0, 9, 4, 0, 11 0, 6, 8, 0, 0, 0, 1, 5, 0, 12 0, 5, 9, 0, 8, 4, 0, 0, 0, 13 0, 0, 2, 0, 0, 5, 0, 1, 0, 14 0, 0, 0, 0, 0, 0, 0, 0, 3, 15 3, 0, 0, 4, 9, 0, 5, 2, 0, 16 }; 17 18 //判断填在空白位置的数字在行、列上是否符合要求 19 int Judge1(int x, int y, int n) 20 { 21 int i; 22 23 for(i=0;i<9;i++) 24 { 25 //判断 列 26 if((sudoku[i][y]==n)&& (i!=x)) 27 return false; 28 //判断 行 29 if((sudoku[x][i]==n)&& (i!=y)) 30 return false; 31 } 32 33 return true; 34 } 35 36 //判断填在空白位置的数字在九宫格之内是否符合要求 37 int Judge2(int x, int y, int n) 38 { 39 int xx,yy,i,j; 40 xx=x/3; 41 yy=y/3; 42 for(i=xx*3;i<xx*3+3;i++) 43 for(j=yy*3;j<yy*3+3;j++) 44 if(sudoku[i][j]==n) 45 if(i==x&& j==y) 46 continue; 47 else 48 return false; 49 return true; 50 } 51 52 // 填充空白数组 53 int Fill(int m) 54 { 55 int n,x,y; 56 57 x = m / 9; // 行号 58 y = m % 9; // 列号 59 60 if (m>=81) 61 return true; 62 63 if (sudoku[x][y]==0) 64 { 65 for(n = 1; n <= 9; n++) 66 { 67 sudoku[x][y] = n; // 从1到9尝试填入数据 68 69 if(Judge1(x, y, n) && Judge2(x, y, n)) // 如果当前填入的数据符合要求,则尝试填入下一个数据 70 { 71 if(Fill(m+1)) 72 return true; 73 } 74 sudoku[x][y]=0; 75 } 76 } 77 else 78 { 79 return Fill(m+1); 80 } 81 82 return false; 83 } 84 85 void show_sudoku(int sudoku[9][9]) 86 { 87 int i; 88 89 for(i = 0; i < 12; i++) 90 printf("__"); 91 printf("\n"); 92 93 for(i = 0; i < 9; i++) 94 { 95 for(j = 0; j < 9; j++) 96 { 97 printf("%d ", sudoku[i][j]); 98 if((j+1)%3 == 0) 99 printf("| "); 100 } 101 printf("\n"); 102 103 if((i+1)%3 == 0) 104 { 105 for(k=0;k<12;k++) 106 printf("__"); 107 printf("\n"); 108 } 109 } 110 } 111 112 int main(void) 113 { 114 //输入初始数独 115 int i,j,k; 116 117 //printf("输入初始数独数据,空白用0代替\n"); 118 #if 0 119 for(i=0;i<9;i++) 120 { 121 for(j=0;j<9;j++) 122 { 123 //cin>>sudoku[i][j]; 124 scanf("%d", &sudoku[i][j]); 125 printf(" "); 126 } 127 printf("\n"); 128 } 129 #endif 130 printf("初始数独数据:\n"); 131 show_sudoku(sudoku); 132 133 printf("\n求解得数独数据:\n"); 134 135 if(Fill(0))//填充数独的空白位置完毕 136 { 137 show_sudoku(sudoku); 138 } 139 else 140 { 141 printf("该数独无解,请注意游戏规则或检查原始数独是否有误\n"); 142 } 143 144 return 0; 145 }
标签:
原文地址:http://www.cnblogs.com/utank/p/4326696.html