CodeForces Gym 100646E Su-Su-Sudoku

有一个未完成的数独游戏,问你能否完成,能就输出一种方案

因为未填的只有5个格子,每个格子都从1-9枚举,然后判就行

我开始时是通过9个数相加为45判的,结果WA,看来是给的可能本身就已经不合法,所以要判断这9个数是否都有,开个bool数组就行

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;
#define ll long long
#define mod 1000000009
#define maxn 105
#define maxm 10003
#define INF 0x3f3f3f3f
int sudo[12][12];
char s0[15];
struct Node
{
	int x, y;
};
Node add[6];
bool used[10];
bool DFS(int pos)
{
	if (pos >= 5)
	{
		for (int i = 0; i < 9; ++i)
		{
			memset(used, 0, sizeof(used));
			for (int j = 0; j < 9; ++j)
				used[sudo[i][j]] = true;
			for (int j = 1; j <= 9; ++j)
				if (used[j] == false)
					return false;
		}
		for (int i = 0; i < 9; ++i)
		{
			memset(used, 0, sizeof(used));
			for (int j = 0; j < 9; ++j)
				used[sudo[j][i]] = true;
			for (int j = 1; j <= 9; ++j)
				if (used[j] == false)
					return false;
		}
		for (int i = 0; i < 3; ++i)
		{
			for (int j = 0; j < 3; ++j)
			{
				memset(used, 0, sizeof(used));
				for (int k = 0; k < 3; ++k)
				{
					for (int l = 0; l < 3; ++l)
						used[sudo[i * 3 + k][j * 3 + l]] = true;
				}
				for (int k = 1; k <= 9; ++k)
					if (used[k] == false)
						return false;
			}
		}
		return true;
	}
	for (int i = 1; i <= 9; ++i)
	{
		sudo[add[pos].x][add[pos].y] = i;
		if (DFS(pos + 1))
			return true;
	}
	return false;
}
int main()
{
	//freopen("input.txt", "r", stdin);
	int T;
	scanf("%d", &T);
	while (T--)
	{
		memset(sudo, 0, sizeof(int) * 12 * 12);
		memset(add, 0, sizeof(add));
		int cnt = 0;
		for (int i = 0; i < 9; ++i)
		{
			scanf("%s", s0);
			for (int j = 0; j < 9; ++j)
			{
				sudo[i][j] = s0[j] - '0';
				if (s0[j] == '0')
				{
					add[cnt].x = i; add[cnt].y = j; ++cnt;
				}
			}
		}
		/*for (int i = 0; i < 5; ++i)
		{
			printf("%d %d\n", add[i].x, add[i].y);
		}*/
		bool flag = false;
		flag = DFS(0);
		if (flag)
		{
			for (int i = 0; i < 9; ++i)
			{
				for (int j = 0; j < 9; ++j)
					printf("%d", sudo[i][j]);
				printf("\n");
			}
		}
		else
			printf("Could not complete this grid.\n");
		if (T > 0)
			printf("\n");
	}
	//system("pause");
	//while (1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值