标签:lock blocks real out oid second ret please 时间
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010
1 #include<bits/stdc++.h> 2 using namespace std; 3 //迷宫地图 4 //X: 墙壁,小狗不能进入 5 //S: 小狗所处的起始位置 6 //D: 迷宫的门 7 //. : 空的方格,表示可以经过的点 8 char maps[8][8]; 9 int n,m,t,di,dj;//n行,m列,t是规定时间内到达,(di,dj):门的位置 10 bool escape;//表示是否逃脱 11 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//上、下、左、右(方向数组) 12 void dfs(int si,int sj,int cnt)//表示起始位置为(si,sj),要求在第cnt秒到达门的位置 13 { 14 if(si>n || sj>m || si<=0 || sj<=0)return;//处理越界情况,直接退出 15 if(si==di && sj==dj && cnt==t){escape=true;return;}//到达出口 16 int tmp=(t-cnt)-abs(si-di)-abs(sj-dj);//abs(x-ex)+abs(y-ey)表示现在所在的格子到目标格子的距离(不能走对角线)剪枝的核心代码 17 if(tmp<0 || tmp&1)return;//t-cnt是实际还需要的步数,将他们做差,如果tmp<0或者tmp为奇数,那就不可能到达! 18 for(int i=0;i<4;i++){//深搜当前方向的每个方向 19 if(maps[si+dir[i][0]][sj+dir[i][1]]!=‘X‘){ 20 maps[si+dir[i][0]][sj+dir[i][1]]=‘X‘;//标记为墙壁,表示不能再走过 21 dfs(si+dir[i][0],sj+dir[i][1],cnt+1);//深搜 22 if(escape)return;//若找到,直接返回 23 maps[si+dir[i][0]][sj+dir[i][1]]=‘.‘;//同时还原本来不是墙但被标记的墙(回溯) 24 } 25 } 26 return; 27 } 28 int main() 29 { 30 int si,sj;//表示起点的坐标 31 while(cin>>n>>m>>t && (m+n+t)){ 32 int wall=0; 33 for(int i=1;i<=n;i++){//从1开始,因为在遍历该点的四个方向时才不会越界的危险 34 for(int j=1;j<=m;j++){ 35 cin>>maps[i][j]; 36 if(maps[i][j]==‘S‘){si=i;sj=j;}//标记小狗的位置 37 else if(maps[i][j]==‘D‘){di=i;dj=j;}//标记出口的位置 38 else if(maps[i][j]==‘X‘)wall++;//计算墙的数量 39 } 40 }//如果剩下的路径长度小于所需t步,注意n*m-wall==t表示地图上可以走的路径长度比t少1,因为此时只有n*m-wall-1条边 41 if(n*m-wall<=t){cout<<"NO"<<endl;continue;} 42 escape=false;//标记为false,表示还没找到 43 maps[si][sj]=‘X‘;//直接标记出发点为墙,表示不能返回 44 dfs(si,sj,0);//从起始位置深搜 45 if(escape)cout<<"YES"<<endl;//逃脱成功 46 else cout<<"NO"<<endl; 47 } 48 return 0; 49 }
题解报告:hdu 1010 Tempter of the Bone
标签:lock blocks real out oid second ret please 时间
原文地址:https://www.cnblogs.com/acgoto/p/9029151.html