首页 > 代码库 > HDU 2102 A计划
HDU 2102 A计划
本题有几个坑注意一下就ok了。
1、碰到传送门一定传送;
2、地图两边都是传送门时不可行;
3、起点S不一定是(0,0,0) //在这点wa了好几发 T_T
处理好这几点后就是一个裸的bfs。(也有大牛写的dfs,个人感觉bfs比较好)
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node {
int x,y,z;
int step;
void init (int nx,int ny,int nz,int nstep){
x=nx;y=ny;z=nz;step=nstep;
}
};
int c,n,m,t;
int x,y,z;
char map[5][20][20];
int visit[5][20][20];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int bfs (){
node a,b;
queue <node> q;
while (!q.empty ())
q.pop ();
a.init (x,y,z,0);
q.push (a);
while (!q.empty ()){
a=q.front ();
q.pop ();
if (a.x<0||a.x>=n||a.y<0||a.y>=m)
continue ;
if (map[a.z][a.x][a.y]==‘#‘){
a.z=(a.z+1)%2;
if (map[a.z][a.x][a.y]==‘#‘)
continue ;
}
if (visit[a.z][a.x][a.y]||map[a.z][a.x][a.y]==‘*‘||a.step>t)
continue ;
visit[a.z][a.x][a.y]=1;
if (map[a.z][a.x][a.y]==‘P‘)
return a.step<=t?1:0;
for (int i=0;i<4;i++){
b=a;
b.step++;
b.x+=dir[i][0];
b.y+=dir[i][1];
q.push (b);
}
}
return 0;
}
int main (){
cin>>c;
while (c--){
memset (visit,0,sizeof visit);
cin>>n>>m>>t;
for (int j=0;j<2;j++)
for (int i=0;i<n;i++){
cin>>map[j][i];
for (int o=0;o<m;o++)
if (map[j][i][o]==‘S‘)
z=j,x=i,y=o;
}
if (bfs ())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}