分析:搜索题,注意剪枝。
#include<iostream>
using namespace std;
int dfs(int si,int sj,int ei,int ej,int mt);
char map[8][8];
int m,n,fa;
int main()
{
int t,i,j,wall,sti,stj,eni,enj;
while(cin>>n>>m>>t &&(n||m||t))
{
wall=0;
fa=0;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;++j)
{
cin>>map[i][j];
if(map[i][j]=='X')
{
wall++;
}
else if(map[i][j]=='S')
{
sti=i;
stj=j;
}
else if(map[i][j]=='D')
{
eni=i;
enj=j;
}
}
}
if(wall>=n*m-t)
{
cout<<"NO"<<endl;
continue;
}
map[sti][stj]='X';
dfs(sti,stj,eni,enj,t);
if(fa)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}
int dfs(int si,int sj,int ei,int ej,int mt)
{
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int temp,i;
if(mt<0) return 0;
if(si<1||sj<1||si>n||sj>m) return 0;
temp=mt-(ei-si)-(ej-sj);
if(temp<0 || temp&1) return 0;
if(map[si][sj]==map[ei][ej] && mt==0)
{
fa=1;
return 1;
}
for(i=0;i<4;i++)
{
if(map[si+dir[i][0]][sj+dir[i][1]]!='X')
{
map[si+dir[i][0]][sj+dir[i][1]]='X';
if(!dfs(si+dir[i][0],sj+dir[i][1],ei,ej,mt-1))
{
map[si+dir[i][0]][sj+dir[i][1]]='.';
}
else
{
return 1;
}
}
}
return 0;
}HDU ACM 1010 Tempter of the Bone ->简单搜索
原文地址:http://blog.csdn.net/a809146548/article/details/45507513