题目大意:
给你一张包含起点S,终点D,墙壁和路的图,路在走过后就会坍塌(不能停留),求从S出发能否在T时刻时刚好到达终点D。
题目分析:
此题不能用BFS,因为求的不是最短时间,而是在T时刻能否刚好达到。
直接用DFS可能会超时,应进行奇偶剪枝。
010101
101010
010101
如图我们发现,从0走到0或从1走到1总需要偶数步,从1走到0或0走到1总需要奇数步。
源代码:
#include<iostream> #include<cmath> #include<string.h> using namespace std; char map[10][10]; int mark[10][10]={0}; int n,m,t,i,j,sx,sy,dx,dy,v; int fang[4][2]={1,0,0,1,-1,0,0,-1}; void dfs(int x,int y,int step) { if(x==dx&&y==dy&&t==step) { v=1; } if(v==1) return; if((abs(dx-x)+abs(dy-y))%2!=(t-step)%2) return; for(int i=0;i<4;i++) { int xx,yy; xx=x+fang[i][0]; yy=y+fang[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&(map[xx][yy]=='.'||map[xx][yy]=='D')&&mark[xx][yy]==0) { mark[xx][yy]=1; dfs(xx,yy,step+1); mark[xx][yy]=0; } } } int main() { while(cin>>n>>m>>t) { v=0; if(n==0&&m==0&&t==0) break; getchar(); memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { cin>>map[i][j]; if(map[i][j]=='S') { sx=i; sy=j; } if(map[i][j]=='D') { dx=i; dy=j; } } getchar(); } mark[sx][sy]=1; dfs(sx,sy,0); if(v==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }当前水平评级:3