hdoj2102 -- A计划 (三维迷宫bfs)
题意:就是正常的bfs迷宫,增添了一层中有传送点'#',可以传送到另一层,这个题一共就两层迷宫,问能不能T步内到达终点。
思路:肯定是开三维数组,特别注意:mp[层][行][列]。这个题思路很清楚,就是要想到怎么写才简洁,代码量越少,越不容易出错,越容易调试。
“最开始我搓一大坨,开了两个if判断两层,重复很多代码”。只在进队列前,判断下下一点是不是传送点'#',是则改变下层数性质,注意传送后的点不能是墙'*'和又是传送点'#'。
只要是bfs迷宫,肯定会用到两个临时的结构体变量,一个取队列头,一个用于改变队列头的下一步(4个方向)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=15;
char mp[2][N][N];
int vis[2][N][N];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,t;
struct Nod{
int x,y,z,time;
}q,p;
void bfs(){
memset(vis,0,sizeof(vis));
q.x=0,q.y=0,q.z=0,q.time=0;
vis[0][0][0]=1;
queue<Nod>Q;
Q.push(q);
while(!Q.empty()){
q=Q.front();
Q.pop();
if(mp[q.z][q.x][q.y]=='P'&&q.time<=t){
while(!Q.empty()) Q.pop();
printf("YES\n");
return;
}
for(int i=0;i<4;i++){
p=q;
p.x+=dir[i][0];
p.y+=dir[i][1];
if(p.x>=0&&p.x<n && p.y>=0&&p.y<m && !vis[p.z][p.x][p.y] && mp[p.z][p.x][p.y]!='*' && p.time<t){
vis[p.z][p.x][p.y]=1;
if(mp[p.z][p.x][p.y]=='#'){
if(p.z==0) p.z=1;
else p.z=0;
vis[p.z][p.x][p.y]=1;
if(mp[p.z][p.x][p.y]=='*'||mp[p.z][p.x][p.y]=='#') continue;
}
p.time++;
Q.push(p);
}
}
}
printf("NO\n");
}
void solve(){
cin>>n>>m>>t;
for(int i=0;i<2;i++){
for(int j=0;j<n;j++){
cin>>mp[i][j];
}
}
bfs();
}
int main()
{
int c;
cin>>c;
while(c--){
solve();
}
return 0;
}
浙公网安备 33010602011771号