标签:
题意:一个n*m的迷宫,从起点到终点,问是否恰能在t个单位时间到达;
思路:dfs遍历各种可能情况,奇偶剪枝;
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; char mm[55][55]; int vis[55][55]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int n,m,t,s1,s2,e1,e2,flag; void dfs(int t1,int t2,int step) { int i,j,k; if(flag) return; if(t1==e1&&t2==e2&&step==t)//剩余步数与剩余时间奇偶性相同时,才可能到达 { printf("YES\n");flag=1;return; } if((abs(e1-t1)+abs(e2-t2))%2!=(t-step)%2) { return; } for(i=0;i<4;i++) { int xx=t1+dir[i][0]; int yy=t2+dir[i][1]; if(xx<0||xx>=n||yy<0||yy>=m||vis[xx][yy]||mm[xx][yy]==‘X‘) continue; vis[xx][yy]=1; dfs(xx,yy,step+1); vis[xx][yy]=0; } } int main() { int i,j,k,cnt; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; memset(mm,0,sizeof(mm));cnt=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf(" %c",&mm[i][j]); if(mm[i][j]==‘S‘) { s1=i,s2=j; } if(mm[i][j]==‘D‘) { e1=i,e2=j;cnt++; } else if(mm[i][j]==‘.‘) { cnt++; } } } memset(vis,0,sizeof(vis)); vis[s1][s2]=1;//初始时,标记掉起始点,重要!!! flag=0; if(cnt>=t) dfs(s1,s2,0);//步数能大于时间时,搜索,小剪枝 if(flag==0) printf("NO\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/dashuzhilin/p/4470078.html