数独 Time Limit: 2000 MSMemory Limit: 32768 K Total Submit: 158(47 users)Total Accepted: 56(37 users)Rating: Special Judge: NoDescription数独应该是一个大家都玩过的游戏,说的就是在一个9*9的方格中填入一些数字,符合以下规则: 1.每一列或每一行中1-9只能出现一次。 2.这个数独划分成的9个小的3*3的方格矩阵内,从1-9的每个数只能出现一次。 Input 输入数据的第一行包括一个整数T,表示有T组测试数据。 每组数据由9行组成,每行由9个整数或者*组成,其中*表示空白的格子。 Output 每组数据输出9行,每行9个整数,表示整个数独。 每两组输出之间有一个空行。 Sample Input 1 *864*2*3* **3**819* **2**9**8 7*9**52** 6**92***3 **17**8*9 3**2**7** *671**9** *1*5*732* Sample Output 986412537 543678192 172359648 739845261 658921473 421763859 395286714 267134985 814597326 Hint数据保证答案唯一。Source新生练习赛(2013.11.24)Author TwIStOy 把每个可能的解试一遍就行了;我是从起点一行一行的搜,直到搜完; #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <string> #include <queue> #include <stack> #include <set> #include <list> using namespace std; typedef long long ll; typedef unsigned long long ull; int a[10][10]; void dfs(int x,int y){ if(a[x][y]){//有确定值的话就返回 if(y==8) dfs(x+1,0);//搜下一行 else dfs(x,y+1);//搜右边 return; } int i,j; if(x==9){//搜完了 for(i = 0;i < 9;i++){ for(j = 0;j < 9;j++) cout << a[i][j]; cout << endl; } cout << endl; return; } int v[10];//不能和同一行,同一列,同一个小方格里的数字重复 memset(v,0,sizeof(v)); for(i = 0;i < 9;i++){ if(a[x][i]) v[a[x][i]] = 1; if(a[i][y]) v[a[i][y]] = 1; } int nx = x/3,ny=y/3; for(i = nx*3;i<(nx+1)*3;i++) for(j = ny*3;j <(ny+1)*3;j++) if(a[i][j]) v[a[i][j]] = 1; for(i = 1;i <= 9;i++) if(!v[i]){//遍历可能的值 a[x][y] = i; if(y==8) dfs(x+1,0);//搜下一行 else dfs(x,y+1);//搜右边 a[x][y] = 0;//记得这个解不行的话,回溯回来要清零 } } int main() { int t; cin >> t; while(t--){ int i,j; char c; for(i = 0;i < 9;i++) for(j = 0;j < 9;j++){ cin >> c; if(c=='*'){//等于零才需要找值 a[i][j] = 0; } else a[i][j] = c-'0'; } dfs(0,0);//从起点找起 } return 0; }