不得不说,这道题真的不难........
【题目描述】
数独是一项非常简单的任务。如图所示,具有9行和9列的方形表被分成9个较小的正方形3x3。在一些单元格中写入从1到9的十进制数字。其他单元格为空。目标是用1到9的十进制数字填充空单元格,每个单元格一个数字,这样在每行,每列和每个标记的3x3子方格中,所有数字从1到9出现。编写程序来解决给定的Sudoku任务。
【输入】
输入数据将以测试用例的数量开始。对于每个测试用例,后面跟着9行,对应于表的行。在每一行上给出一串精确的9位十进制数字,对应于该行中的单元格。如果单元格为空,则表示为0。
【输出】
对于每个测试用例,您的程序应以与输入数据相同的格式打印解决方案。必须根据规则填充空单元格。如果解决方案不是唯一的,则程序可以打印其中任何一个。
【输入示例】
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
【输出示例】
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
这道题可以说除了判断九宫格没啥难点。((i-1)/3*3+(j-1)/3+1)
对了,那些ans是指数字有没有在此行此列中出现过。
放代码,哈欠~~~~
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int a[1100][1100]; 5 int ans1[1100][1100],ans2[1100][1100],ans3[1100][1100]; 6 int n; 7 bool k=0; 8 void put(int x,int y) 9 { 10 if(k==1) 11 { 12 return ; 13 } 14 if(a[x][y]!=0) 15 { 16 if(x==9&&y==9) 17 { 18 for(int i=1; i<=9; i++) 19 { 20 for(int j=1; j<=9; j++) 21 { 22 cout<<a[i][j]; 23 } 24 cout<<endl; 25 } 26 k=1; 27 cout<<endl; 28 return ; 29 } 30 if(y==9) 31 { 32 put(x+1,1); 33 } 34 else 35 { 36 put(x,y+1); 37 } 38 } 39 if(a[x][y]==0) 40 { 41 for(int i=1; i<=9; i++) 42 { 43 if(ans1[x][i]==0&&ans2[y][i]==0&&ans3[(x-1)/3*3+(y-1)/3+1][i]==0) 44 { 45 a[x][y]=i; 46 ans1[x][i]=1; 47 ans2[y][i]=1; 48 ans3[(x-1)/3*3+(y-1)/3+1][i]=1; 49 if(x==9&&y==9) 50 { 51 for(int i=1; i<=9; i++) 52 { 53 for(int j=1; j<=9; j++) 54 { 55 cout<<a[i][j]; 56 } 57 cout<<endl; 58 } 59 k=1; 60 cout<<endl; 61 return ; 62 } 63 if(y==9) 64 { 65 put(x+1,1); 66 } 67 else 68 { 69 put(x,y+1); 70 } 71 a[x][y]=0; 72 ans1[x][i]=0; 73 ans2[y][i]=0; 74 ans3[(x-1)/3*3+(y-1)/3+1][i]=0; 75 } 76 } 77 } 78 } 79 int main() { 80 cin>>n; 81 for(int l=1; l<=n; l++) 82 { 83 memset(ans1,0,sizeof(ans1)); 84 memset(ans2,0,sizeof(ans2)); 85 memset(ans3,0,sizeof(ans3)); 86 for(int i=1; i<=9; i++) 87 { 88 for(int j=1; j<=9; j++) 89 { 90 char ch; 91 cin>>ch; 92 a[i][j]=ch-'0'; 93 if(a[i][j]>0) 94 { 95 ans1[i][a[i][j]]=1; 96 ans2[j][a[i][j]]=1; 97 ans3[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1; 98 } 99 } 100 } 101 k=0; 102 put(1,1); 103 } 104 }
好了,还有题等着我,拜~~
在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。
来源:https://www.cnblogs.com/DK-F/p/9448516.html