ZCMU—1597

来源:互联网 发布:淘宝大连博哲贸易怎样 编辑:程序博客网 时间:2024/05/17 07:57

1597: TomCat的数独

Time Limit: 1 Sec  Memory Limit: 128 MB
[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考虑可以把每一个格子的可能的数字和不可能的数字都列出来与每一行每一列和所在小矩阵进行比较得出结果。

【分析】

比较靠近实际的一道题...暴搜就好了,因为check的限制条件,所以搜不了几个答案的...而且答案保证唯一,那就更简单了。
直接搜,判断能否满足条件的时候仔细一点就可以
【代码】
#include <stdio.h>int n=9;int a[10][9];int c;int check(int x,int y,int q){int xx=(int)(x/3)*3;int yy=(int)(y/3)*3;for (int i=0;i<n;i++)if (a[x][i]==q || a[i][y]==q)return 0;for (int i=xx;i<xx+3;i++)for (int j=yy;j<yy+3;j++)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]) find(now+1);else{for (int i=1;i<10;i++)if (check(x,y,i)){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;}


0 0
原创粉丝点击