1597: TomCat的数独
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 58 Solved: 29
[Submit][Status][Web Board]
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考虑可以把每一个格子的可能的数字和不可能的数字都列出来与每一行每一列和所在小矩阵进行比较得出结果。
Source
【解析】
来补题。。。。用VS调试看代码,就懂了。
#include <bits/stdc++.h>
using namespace std;
int a[9][9];
int check(int x, int y, int k)
{
int p, q, i, j;
p = (x / 3) * 3;//表示是哪一个3*3的矩阵,得到该3*3矩阵的左上角坐标为p行第q个
q = (y / 3) * 3;
for (i = 0; i<9; i++)
{
if (a[x][i] == k || a[i][y] == k)//判断那一列或者那一行当中有没有一样的
return 0;
}
for (i = p; i<p + 3; i++)
for (j = q; j<q + 3; j++)
if (a[i][j] == k)//判断那个3*3的矩阵
return 0;
return 1;
}
void facs(int now)
{
int p, q, i, j;
p = now / 9;//获取行
q = now % 9;//获取列
if (now == 81)//递归出口
{
for (i = 0; i<9; i++)
{
for (j = 0; j<9; j++)
{
if (j == 0)
printf("%d", a[i][j]);
else
printf(" %d", a[i][j]);
}
printf("\n");
}
return;
}
if (a[p][q] != 0)
facs(now + 1);//表示这个数不能改了
else
{
for (i = 1; i<10; i++)
{
if (check(p, q, i))
{
a[p][q] = i;
facs(now + 1);
a[p][q] = 0;
}
}
}
}
int main()
{
int t, i, j;
scanf("%d", &t);
while (t--)
{
for (i = 0; i<9; i++)
for (j = 0; j<9; j++)
scanf("%d", &a[i][j]);
facs(0);
}
return 0;
}