思路:
这道题用搜索
我们枚举每一位上的值,然后判断它在行,列,格中是否可行就可以了
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
bool flag;
int a[10][10];
int f[10][10], f1[10][10], f2[10][10];
int dg[10]={0, 1, 1, 1, 2, 2, 2, 3, 3, 3};
void dfs(int x, int y)
{/*
cout<<endl;
for(int i=1; i<=9; i++, cout<<endl)
for(int j=1; j<=9; j++)
printf("%d ", a[i][j]);
cout<<endl<<endl;*/
if(flag)
return;
if(x>9)
{
flag=1;
for(int j=1; j<=9; j++)
for(int i=1; i<=9; i++)
printf("%d", a[i][j]);
return;
}
if(a[x][y]!=0)
{
if(y==9)
dfs(x+1, 1);
else
dfs(x, y+1);
}
int d;
if(x<=3)
d=dg[y];
else
if(x<=6)
d=3+dg[y];
else
d=6+dg[y];
for(int i=1; i<=9; i++)
{
if(f[x][i]==1||f1[y][i]==1||f2[d][i]==1||a[x][y]!=0)
continue;
f[x][i]=1;
f1[y][i]=1;
f2[d][i]=1;
a[x][y]=i;
if(y==9)
dfs(x+1, 1);
else
dfs(x, y+1);
f[x][i]=0;
f1[y][i]=0;
f2[d][i]=0;
a[x][y]=0;
}
}
int main()
{
cin>>s;
while(s!="end")
{
flag=0;
for(int j=1; j<=9; j++)
for(int i=1; i<=9; i++)
if(s[(j-1)*9+i-1]!='.')
a[i][j]=s[(j-1)*9+i-1]-48;/*
for(int i=1; i<=9; i++, cout<<endl)
for(int j=1; j<=9; j++)
printf("%d", a[i][j]);*/
for(int i=1; i<=9; i++)
for(int j=1; j<=9; j++)
{
f[i][a[i][j]]=1;
f1[j][a[i][j]]=1;
if(i<=3)
f2[dg[j]][a[i][j]]=1;
else
if(i<=6)
f2[3+dg[j]][a[i][j]]=1;
else
f2[6+dg[j]][a[i][j]]=1;
}
dfs(1, 1);
cout<<endl;
cin>>s;
memset(f, 0, sizeof(f));
memset(f1, 0, sizeof(f1));
memset(f2, 0, sizeof(f2));
memset(a, 0, sizeof(a));
}
}