1597: TomCat的数独
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 63 Solved: 31
Description
都说了TomCat是一只有文化的Cat你还不信。
很久很久以前TomCat就喜欢上了数独游戏。游戏规则是这样的,在一个9*9的矩阵里面每一行每一列都由1,2,3,4,5,6,7,8,9这9个数构成,而且每一个3*3的小矩阵里也由1,2,3,4,5,6,7,8,9这9 个数构成(如下图)。然而TomCat是一只学渣,所以…….你懂的
Input
第一行输入一个T,表示数据组数。
接下来输入9*9的矩阵,未知的单位用0表示。(数据保证有唯一结果)
Output
输出运行结果,格式如下
Sample Input
1
0 4 6 0 0 1 0 0 0
7 9 0 3 5 0 6 0 1
0 0 5 0 9 0 3 2 4
0 0 0 0 8 0 4 0 5
0 3 0 2 1 5 0 0 0
5 8 9 0 0 0 0 7 2
2 0 0 6 0 9 5 1 0
1 0 8 5 0 2 0 0 0
0 5 3 0 4 0 2 0 7
Sample Output
3 4 6 8 2 1 7 5 9
7 9 2 3 5 4 6 8 1
8 1 5 7 9 6 3 2 4
6 2 1 9 8 7 4 3 5
4 3 7 2 1 5 8 9 6
5 8 9 4 6 3 1 7 2
2 7 4 6 3 9 5 1 8
1 6 8 5 7 2 9 4 3
9 5 3 1 4 8 2 6 7
HINT
TomCat考虑可以把每一个格子的可能的数字和不可能的数字都列出来与每一行每一列和所在小矩阵进行比较得出结果。
-
解题:就一个个搜就好了。。代码是学长的,然后自己打的时候对照着加了注释(自己的理解~~)
- 代码参考:https://blog.csdn.net/jnxxhzz/article/details/53886852
#include<bits/stdc++.h>
using namespace std;
int n=9;
int a[10][9];
int c;
int check(int x,int y,int q)//第x行第y列
{
int xx=(int)(x/3)*3;//x,y均不会为9;小于3的:0~2;大于等于6的:6~8
int yy=(int)(y/3)*3;
for(int i=0;i<n;i++) //检查行和列
if(a[x][i]==q||a[i][y]==q)
return 0;//如果有这个数字就返回0
for(int i=xx;i<xx+3;i++)
for(int j=yy;j<yy+3;j++)//检查相邻的3*3
if(a[i][j]==q)
return 0;
return 1;
}
void write()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][n-1]);
}
}
void find(int now)
{
int x=now/9;//第几行
int y=now%9;//第几列
if(now==81)//每个都走完了,该输出了
{
write();
return;
}
if(a[x][y]) //如果a[x][y]不是0,就继续找,知道找到为0的那个;递归
find(now+1);
else{
for(int i=1;i<10;i++)
if(check(x,y,i))//调用函数,如果返回不是0即没有这个数字就赋值然后下一次寻找
{
a[x][y]=i;
find(now+1);
a[x][y]=0;
}
}
}
int main()
{
int pp;//循环次数
scanf("%d",&pp);
while(pp--)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
find(0);
}
return 0;
}