ZCMU-1597: TomCat的数独

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

扫描二维码关注公众号,回复: 2377861 查看本文章

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;
}

猜你喜欢

转载自blog.csdn.net/waterboy_cj/article/details/81209465