HDU--杭电--2102--A计划--深搜
15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..
YES
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,m,t,xx[4][2]={{1,0},{0,1},{-1,0},{0,-1}},xp,yp,visit[2][11][11]; //xp、yp是终点坐标char map[2][11][11]; //因为有两层,所以用三维void input(int x) //输入地图,因为要输入两次,所以写个子函数减少代码长度--!{ for(int i=0;i<n;i++) for(int j=0;j<m;j++) { visit[x][i][j]=1; //顺便初始化visit数组 cin>>map[x][i][j]; if(map[x][i][j]=='P')xp=i,yp=j; //把终点坐标记录下来 }}int ABS(int a) //求绝对值{ return a>0?a:-a;}bool dfs(int X,int Y,int Z,int step){ int i,j,k,l,x,y,z; if(map[Z][X][Y]=='P')return 1; //到终点了 if(step==0)return 0; //没时间了 x=ABS(X-xp)+ABS(Y-yp); //x里面放当前地点到终点的最短距离 if(x>step)return 0; //剩余时间不够 for(i=0;i<4;i++) { x=X+xx[i][0]; y=Y+xx[i][1]; z=Z; if(x>=0&&y>=0&&x<n&&y<m&&visit[z][x][y]&&map[z][x][y]!='*') //不出界,visit标记没访问,地图不是* { if(map[z][x][y]=='#')z=1-z; //如果是#就要变到另外一层 visit[z][x][y]=0; if(map[z][x][y]!='#'&&map[z][x][y]!='*'&&dfs(x,y,z,step-1))return 1; //不允许是*和#,*会撞死,#会无线循环 visit[z][x][y]=1; } } return 0;}int main (void){ int T,i,j,k,l; cin>>T; while(T--&&cin>>n>>m>>t) { input(0); input(1); if(dfs(0,0,0,t))cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0;}
就只是一个普通的深搜,不过有点要注意,题目要求的是t时间内到达哦,亲,还有剪枝问题,不用奇偶剪枝,还有判断条件要区分是哪一层,最好是直接等于P