数独。

#include<iostream>
#include<cstring>
using namespace std;
bool row[10][10];//row[i][j]表示第i行是否有j
bool column[10][10];//column[i][j]表示第i列是否有j
bool district[3][3][10];//district[i][j][k]表示第(i,j)区域是否有k
//这里,将数独分为9个district,每个district就是一个3*3的宫,分别为:
//(0,0),(0,1),(0,2)
//(1,0),(1,1),(1,2)
//(2,0),(2,1),(2,2)
char sodu[10][10];
bool flag;
void soduKiller(int pos)
{
	while (pos <= 80 && sodu[pos / 9][pos % 9] >= '1'&&sodu[pos / 9][pos % 9] <= '9')pos++;
	if (pos == 81)
	{
		flag = 1;
		return;
	}
	int i;
	for (i = 1; i <= 9; i++)
	{
		if (row[pos / 9][i] || column[pos % 9][i] || district[pos / 9 / 3][pos % 9 / 3][i])continue;
		row[pos / 9][i] = column[pos % 9][i] = district[pos / 9 / 3][pos % 9 / 3][i] = 1;
		sodu[pos / 9][pos % 9] = i + 48;
		soduKiller(pos + 1);
		if (flag)return;
		sodu[pos / 9][pos % 9] = '?';
		row[pos / 9][i] = column[pos % 9][i] = district[pos / 9 / 3][pos % 9 / 3][i] = 0;
	}
}
int main()
{
	int index = 0;
	char temp;
	while (cin >> sodu[index / 9][index % 9])
	{
		temp = sodu[index / 9][index % 9];
		row[index / 9][temp - 48] = 1;
		column[index % 9][temp - 48] = 1;
		district[index / 9 / 3][index % 9 / 3][temp - 48] = 1;
		if (index == 80)
		{
			flag = 0;
			soduKiller(0);
			cout << endl;
			int i, j;
			for (i = 0; i < 9; i++)
			{
				for (j = 0; j < 9; j++)
				{
					cout << sodu[i][j];
					if (j != 8)cout << " ";
				}
				cout << endl;
			}
			index = 0;
			memset(row, 0, sizeof(row));
			memset(column, 0, sizeof(column));
			memset(district, 0, sizeof(district));
		}
		else index++;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丨秋水丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值