#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++;
}
}
数独。
猜你喜欢
转载自blog.csdn.net/NONElgh/article/details/72731397
今日推荐
周排行