功能:
- 输入一个数独(用二维数组表示),求出数独的解。
效果图:
实现原理:
- DFS搜索遍历。
- 二维数组储存数据。
源代码:
#include<iostream>
#include<cstring>
#include<cstring>
#include<cstdio>
using namespace std;
int data[112][112];
void put()
{
cout << "----------------------" << endl;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << data[i][j] << " ";
if ((j+1)%3 == 0)
cout << " ";
}
cout << endl;
if ((i+1)%3 == 0)
cout << endl;
}
cout << "----------------------" << endl;
}
bool check(int x, int y)
{
for (int i = 0; i <= 9; i++)
{
if (data[i][y] == data[x][y] && i != x)
return false;
if (data[x][i] == data[x][y] && i != y)
return false;
}
int x0 = x/3*3;
int y0 = y/3*3;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i+x0 == x && j+y0 == y)
continue;
if (data[i+x0][j+y0] == data[x][y])
return false;
}
}
return true;
}
int fun(int cnt)
{
int x, y;
if (cnt == 81)
return 1;
x = cnt/9;
y = cnt%9;
if (data[x][y] != 0)
{
fun(cnt+1);
}
else
{
for (int i = 1; i <= 9; i++)
{
data[x][y] = i;
if (check(x, y))
{
if(fun(cnt+1))
return 1;
}
}
data[x][y] = 0;
return 0;
}
}
int main()
{
int n, x, y, t;
while (cin >> n)
{
memset(data, 0, sizeof(data));
for (int i = 0; i < n; i++)
{
cin >> x >> y >> t;
data[x-1][y-1] = t;
}
fun(0);
cout << "end" << endl;
put();
}
}
PS:
当初群里有人问一个数独怎么解时,然后自己DFS也不太熟练,花了半个小时写了这个,满满的成就感!