数独是一个非常简单的任务。一个9行9列的方桌被分割成9个较小的3 * 3的正方形,如图所示。有些单元格写的是从1到9的十进制数字。其他单元格是空的。目标是用从1到9的十进制数字填充空单元格,每个单元格一个数字,这样在每一行、每一列和每一个标记为3x3的子正方形中,从1到9的所有数字都会出现。编写一个程序来解决给定的数独任务。
Input
输入数据将从测试用例的数量开始。对于每个测试用例,后面有9行,对应于表中的行。每一行都给出了与这一行的单元格对应的9位小数。如果单元格为空,则用0表示。
Output
对于每个测试用例,您的程序应该以与输入数据相同的格式打印解决方案。空单元格必须根据规则进行填充。如果解决方案不是唯一的,那么程序可以打印其中的任何一个。
Sample Input
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
Sample Output
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
思路是:
矩阵最多是9*9,所以可以用dfs直接搜。
int n;
char mp[10][10];
int ans[10][10];//答案矩阵
bool v[4][10][10],fl=0;
//v[0][i][j]表示第i个矩阵中j是否出现
//v[1][i][j]表示第i行中j是否出现
//v[2][i][j]表示第i列中j是否出现
//v[3][i][j]表示第mp[i][j]是否访问
然后需要一个函数来判断在第几个矩阵,我们依次将矩阵编号为1~9。
int joing(int x,int y)
{
if(x<=3){
if(y<=3) return 1;
if(y>3&&y<=6) return 2;
if(y>6&&y<=9) return 3;
}
if(x>3&&x<=6){
if(y<=3) return 4;
if(y>3&&y<=6) return 5;
if(y>6&&y<=9)