#include<stdio.h> #include<math.h> int n,m,t,flag; int starx,stary,doorx,doory,wallnumber; int movex[]={0,-1,0,1},movey[]={-1,0,1,0}; char maze[7][7]; void dfs(int,int,int); //深搜 int main() { int i,j; while(scanf("%d %d %d",&n,&m,&t)!=EOF && !(n==0 && m==0 && t==0)) { getchar(); //吸收回车 wallnumber=0; flag=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&maze[i][j]); if(maze[i][j]=='S') //记录小狗的起始位置 { starx=i; stary=j; maze[starx][stary]='X'; //注意起点位置的标记,容易遗漏 } else if(maze[i][j]=='D') //记录门的位置 { doorx=i; doory=j; } else if(maze[i][j]=='X') wallnumber++; //记录墙的数量 } getchar(); //吸收回车 } if(n*m-wallnumber>=t) //当可以走的街区数大于时间才进入搜索 { dfs(starx,stary,0); } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; } void dfs(int sx,int sy,int startime) { int i,time; if(sx==doorx && sy==doory && startime==t) {flag=1;return;} time=t-startime-abs(sx-doorx)-abs(sy-doory); //time为剩余时间 if(time<0 || time%2!=0) //剪掉奇数枝 return; for(i=0;i<4;i++) //上下左右四个方向 { if(sx+movex[i]<0||sx+movex[i]>n-1||sy+movey[i]<0||sy+movey[i]>m-1) //注意边界问题:是>n-1,m-1 continue; if(maze[sx+movex[i]][sy+movey[i]]!='X') { maze[sx+movex[i]][sy+movey[i]]='X'; dfs(sx+movex[i],sy+movey[i],startime+1); //注意此时startime+1和startime++的区别 maze[sx+movex[i]][sy+movey[i]]='.'; //遍历后还原 } if(flag) break; } }
杭电1010
最新推荐文章于 2021-09-09 23:33:32 发布