dfs搜索的題目,還是不太會寫啊!參考了別人的代碼寫的。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int map[9][9];
int flag;
bool seach(int a,int b,int k)
{
int i,j;
for(i=0;i<9;i++) //判斷每列是否已經出現k
{
if(map[i][b]==k)
return true;
}
for(i=0;i<9;i++) //判斷每行是否已經出現k
{
if(map[a][i]==k)
return true;
}
for(i=a/3*3;i<a/3*3+3;i++) //判斷每個宮格是否已經出現k
{
for(j=b/3*3;j<b/3*3+3;j++)
{
if(map[i][j]==k)
return true;
}
}
return false;
}
void dfs(int a,int b)
{
int k;
if(a==9)
{
flag=1;
return ;
}
if(!map[a][b])
{
for(k=1;k<=9;k++)
{
if(!seach(a,b,k))
{
map[a][b]=k;
// cout<<k<<endl;
if(b==8) dfs(a+1,0);
else dfs(a,b+1);
if(flag) return ;
map[a][b]=0;
}
}
}
else
{
if(b==8)
dfs(a+1,0);
else
dfs(a,b+1);
}
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j;
char c;
int cnt=0;
while(cin>>c)
{
memset(map,0,sizeof(map));
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(i!=0||j!=0) //開始的時候將|| 寫成&&,改了很久纔看出,慚愧啊!
cin>>c;
if(c>'0'&&c<='9')
map[i][j]=c-'0';
}
}
if(cnt) cout<<endl;
cnt++;
flag=0;
dfs(0,0);
for(i=0;i<9;i++)
{
for(j=0;j<8;j++)
{
cout<<map[i][j]<<' ';
}
cout<<map[i][j]<<endl;
}
}
return 0;
}