题意:填写数独中所缺的。
方法:深搜
代码:
#include <iostream>
#include <cstdio>
#define N 9
using namespace std;
int a[N][N];
bool flag;
bool judge(int hang, int lie, int val)
{
int h = hang/3, l = lie/3;
for (int i=h*3; i<h*3+3; i++)//保证数字所在的9个格子没有数相同
for (int j=l*3; j<l*3+3; j++)
if (a[i][j] == val && a[i][j]!=0)
return false;
for (int i=0; i<N; i++)//保证数字所在的行没有数相同
if (a[hang][i] == val && a[hang][i]!=0)
return false;
for (int i=0; i<N; i++)//保证数字所在的列没有数相同
if (a[i][lie] == val && a[i][lie]!=0)
return false;
return true;
}
void dfs(int n)
{
int hang = n/9, lie = n%9;
if (n==81)
{
flag = true;
return ;
}
if (a[hang][lie] != 0)
dfs(n+1);
else
{
for (int i=9; i>=1 && !flag; i--)
if (judge(hang, lie, i))
{
a[hang][lie] = i;
dfs(n+1);
}
if (!flag)//当已经找到数独的时候不在回溯
a[hang][lie] = 0;
}
}
int main()
{
int n;
char c, temp;
scanf("%d", &n);
getchar();
while (n--)
{
for (int i=0; i<N; i++)
{
for (int j=0; j<N; j++)
{
scanf("%c", &c);
a[i][j]=c-'0';
}
scanf("%c",&temp);
}
flag = false;
dfs(0);
for (int i=0; i<N; i++)
{
for (int j=0; j<N; j++)
printf("%d", a[i][j]);
printf("\n");
}
}
return 0;
}