HDU 1010 Tempter of the Bone (DFS)

来源:互联网 发布:淘宝订单如何申请退款 编辑:程序博客网 时间:2024/05/13 08:06

因为要求不是最快到达,而是在T时刻正好到达,所以不能用BFS搜。DFS注意剪枝,如果剩余时间和剩余步数奇偶性不同的话要减掉。

//Memory: 232 KB//Time: 687 MS#include <stdio.h>#include <string.h>#include <math.h>char map[10][10];bool vis[10][10];int dx,dy,n,m,time;int d[4][2]={1,0,0,1,-1,0,0,-1};bool flag;void dfs(int x,int y,int t){if((x+y+dx+dy)%2 != t%2)return;if(t==0)return;if(flag)return;vis[x][y]=true;int k=0,xt,yt;for(k=0;k<4;k++){xt=x+d[k][0];yt=y+d[k][1];if(xt>=1 && xt<=n && yt>=1 && yt<=m )if(map[xt][yt]!='X' && !vis[xt][yt]){if(dx==xt && dy==yt && t==1)flag=true;else{dfs(xt,yt,t-1);}if(flag)return;}}vis[x][y]=false;}int main(){while(scanf("%d%d%d",&n,&m,&time)!=EOF){if(n==0 && m==0 && time==0)break;flag=false;memset(vis,false,sizeof(vis));int i,j;int st,sy;getchar();for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S'){st=i;sy=j;}if(map[i][j]=='D'){dx=i;dy=j;}}getchar();}dfs(st,sy,time);if(flag)printf("YES\n");elseprintf("NO\n");}return 0;}