数独
数独
时间限制: 1 Sec 内存限制: 128 MB题目描述
这个游戏只有一个规则:
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含1-9这9个数字
正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含1-9这9个数字
正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
输入
输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
输出
输出一共9行,每行9个数字,表示你的答案。
题解
不喜欢这种麻烦的搜索题。给每个小九宫格编号,记录每行、列、小九宫格中是否出现数字i,用来剪枝,dfs时枚举1到9,判断在(x,y)这个位置能否是i。
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<iostream> 5 using namespace std; 6 char c[10][10]; 7 int g[10][10]; 8 bool vr[10][10], vc[10][10], p[10][10]; 9 int GetNum(int x, int y) 10 { 11 if(x <= 3) return y / 3 + (y % 3 != 0); 12 if(x <= 6) return 3 + y / 3 + (y % 3 != 0); 13 if(x <= 9) return 6 + y / 3 + (y % 3 != 0); 14 } 15 void print() 16 { 17 for(int i = 1; i <= 9; i++) 18 { 19 for(int j = 1; j <= 9; j++) 20 printf("%d", g[i][j]); 21 printf("\n"); 22 } 23 exit(0); 24 } 25 void dfs(int x, int y) 26 { 27 if(x >= 10) print(); 28 if(g[x][y]) 29 { 30 if(y < 9) dfs(x, y + 1); 31 else dfs(x + 1, 1); 32 return; 33 } 34 int t = GetNum(x, y); 35 for(int i = 1; i <= 9; i++) 36 if(!vr[x][i] && !vc[y][i] && !p[t][i]) 37 { 38 vr[x][i] = 1; vc[y][i] = 1; p[t][i] = 1; g[x][y] = i; 39 if(y < 9) dfs(x, y + 1); 40 else dfs(x + 1, 1); 41 vr[x][i] = 0; vc[y][i] = 0; p[t][i] = 0; g[x][y] = 0; 42 } 43 } 44 int main() 45 { 46 for(int i = 1; i <= 9; i++) 47 scanf("%s", c[i] + 1); 48 for(int i = 1; i <= 9; i++) 49 for(int j = 1; j <= 9; j++) 50 if(isdigit(c[i][j])) 51 { 52 g[i][j] = c[i][j] - '0', 53 vr[i][g[i][j]] = 1, 54 vc[j][g[i][j]] = 1; 55 int t = GetNum(i, j); 56 p[t][g[i][j]] = 1; 57 } 58 dfs(1,1); 59 return 0; 60 }