数独。

#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++;
	}
}
发布了5 篇原创文章 · 获赞 0 · 访问量 3091

猜你喜欢

转载自blog.csdn.net/NONElgh/article/details/72731397
今日推荐