#include<iostream>
#include<array>
using namespace std;
array<array<int, 9>, 9>a;
int sudofind(int m, int n, array<int, 9>& b)
{
array<int, 10>c;
b.fill(0);
c.fill(0);
for (int i = 0; i < 9; i++)
{
c[a[i][n]]++;
c[a[m][i]]++;
}
for (int i = m - m % 3; i <= m + 2 - m % 3; i++)
for (int j = n - n % 3; j <= n + 2 - n % 3; j++)
c[a[i][j]]++;
int k = 0;
for (int i = 1; i < 10; i++)
if (0 == c[i])
{
b[k] = i;
k++;
}
return k;
}
bool sudoku(int m, int n)
{
if (8 == m && 8 == n)
{
if (0 != a[m][n])
return true;
else
{
array<int, 9>b;
sudofind(m, n, b);
if (0 != b[0])
{
a[m][n] = b[0];
return true;
}
else
return false;
}
}
else if (0 == a[m][n])
{
array<int, 9>b;
int end = sudofind(m, n, b);
if (0 == b[0])
return false;
else
{
for (int k = 0; k < end; k++)
{
a[m][n] = b[k];
if (8 != n)
{
if (true == sudoku(m, n + 1))
return true;
}
else if (8 != m)
if (true == sudoku(m + 1, 0))
return true;
a[m][n] = 0;
}
return false;
}
}
else if (8 != n)
{
if (true == sudoku(m, n + 1))
return true;
}
else if (8 != m)
if (true == sudoku(m + 1, 0))
return true;
}
int main()
{
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
cin >> a[i][j];
if (true == sudoku(0, 0))
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
cout << a[i][j] << ' ';
cout << endl;
}
return 0;
}
洛谷P1784 数独进阶解法
最新推荐文章于 2022-08-16 19:17:29 发布