思路
这道题用搜索实现。
我们可以用三个数组
l
,
h
,
g
g
l,h,gg
l,h,gg 来存放行,列和九宫格里数字的状态。
然后模拟数字填写过程,把一到九全部考虑一次。
C o d e Code Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int h[10][10],l[10][10],gg[10][10][10],a[10][10];
int w=0;
string T;
int check(int x)
{
if(x<=3)
return 1;
if(x>3&&x<=6)
return 2;
if(x>6&&x<=9)
return 3;
}
void dfs(int x,int y)
{
if(w==1)
return;
if(x>9&&y==1)
{
for(int i=1; i<=9; i++)
for(int j=1; j<=9; j++)
cout<<a[i][j];
cout<<endl;
w=1;
return;
}
if(a[x][y]!=0)
{
if(y==9)
dfs(x+1,1);
else
dfs(x,y+1);
}
else
for(int i=1; i<=9; i++)
{
if(h[x][i]==0&&l[y][i]==0&&gg[check(x)][check(y)][i]==0)
{
a[x][y]=i;
h[x][i]=1;
l[y][i]=1;
gg[check(x)][check(y)][i]=1;
if(y==9)
dfs(x+1,1);
else
dfs(x,y+1);
a[x][y]=0;
h[x][i]=0;
l[y][i]=0;
gg[check(x)][check(y)][i]=0;
}
}
}
int main()
{
while(cin>>T)
{
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
memset(gg,0,sizeof(gg));
if(T=="end")
break;
for(int i=1; i<=9; i++)
for(int j=1; j<=9; j++)
{
if(T[(i-1)*9+j-1]>='1'&&T[(i-1)*9+j-1]<='9')
{
a[i][j]=T[(i-1)*9+j-1]-48;
h[i][a[i][j]]=1;
l[j][a[i][j]]=1;
gg[check(i)][check(j)][a[i][j]]=1;
}
}
// for(int i=1; i<=9; i++)
// for(int j=1; j<=9; j++)
// cout<<a[i][j];
// cout<<endl;
w=0;
dfs(1,1);
}
return 0;
}