深搜练习题;注意剪枝,否则超时。。。。
学了好久了,一直没用过深搜,这次自己像个写了深搜的代码实现,呵呵,还行;
#include<stdio.h>
#include<math.h>
#define N 12
int dir[4][2]={0,1, 0,-1, 1,0,-1,0};
char map[N][N];
int a,b,t,x1,x2,s1,s2;
bool judge(int x,int y)
{
if(x>=0 && x<a && y>=0 && y<b && map[x][y]!='X')
return 1;
return 0;
}
int dfs(int x,int y,int tt)
{
int i;
if(t-tt<(abs(s1-x)+abs(s2-y))||((t-tt-abs(s1-x)-abs(s2-y)))%2) //剪枝;
return 0; ;
tt++;
map[x][y]='X'; //标记走过;
for(i=0;i<4;i++)
{
if(map[x+dir[i][0]][y+dir[i][1]]=='D')
{
if(tt==t)
return 1;
}
else if(judge(x+dir[i][0],y+dir[i][1])&&bfs(x+dir[i][0],y+dir[i][1],tt))//如果下步能走,走,如果返回成功,则返回1;
return 1;
}
map[x][y]='.';
return 0; //走不通,返回0;
}
int main ()
{
int i,k,f;
while(scanf("%d%d%d",&a,&b,&t)!=EOF&&a||b||t)
{
x1=x2=f=0;
for(i=0;i<a;i++)
{
scanf("%s",map[i]);
for(k=0;k<b;k++)
{
if(map[i][k]=='S')
{
x1=i;
x2=k;
}
if(map[i][k]=='D')
{
s1=i;
s2=k;
}
}
}
f=bfs(x1,x2,0);
if(f)
puts("YES");
else
puts("NO");
}
return 0;
}