HDU 2102 A计划 (三维的迷宫BFS)

题目链接:传送门

题意:

三维的一个迷宫,起点在第一层的S(0,0,0)处,问能否在规定的时间内走到第二层的P

处。’*’代表不能走,’.’代表可以走,’#’代表传送门,这里有一个trick,走到传送门的时

候必须要传送。之前没有注意到WA了很多遍。

而且在初始的时候可以对地图进行一下处理,(‘*’,’#’),(‘#’,’*’),(‘#’,’#’)这样的肯定

是不可以走的,,所以可以把他们都变成’*’

代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int maxn = 50;char mp[2][maxn][maxn];int vis[2][maxn][maxn];int dx[4]= {1,-1,0,0};int dy[4]= {0,0,-1,1};int n,m,limit;struct nod {int x,y,z;int step;nod() {}nod(int _x,int _y,int _z):x(_x),y(_y),z(_z) {}};bool check(nod tmp){if(vis[tmp.z][tmp.x][tmp.y]) return false;if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&mp[tmp.z][tmp.x][tmp.y]!='*') return true;return false;}bool bfs() {nod st=nod(0,0,0);vis[0][0][0]=1;st.step=0;queue<nod> Q;Q.push(st);while(!Q.empty()) {nod tmp = Q.front();//cout<<tmp.z<<" "<<tmp.x<<" "<<tmp.y<<" "<<tmp.step<<endl;Q.pop();if(mp[tmp.z][tmp.x][tmp.y]=='P'&&tmp.step<=limit) {return true;} else if(mp[tmp.z][tmp.x][tmp.y]=='P') {return false;}for(int i=0; i<4&&mp[tmp.z][tmp.x][tmp.y]!='#'; i++) {nod top;top.x=tmp.x+dx[i],top.y=tmp.y+dy[i],top.z=tmp.z,top.step=tmp.step+1;if(check(top)){Q.push(top);vis[top.z][top.x][top.y]=1;}}if(mp[tmp.z][tmp.x][tmp.y]=='#'){tmp.z^=1;Q.push(tmp);vis[tmp.z][tmp.x][tmp.y]=1;}}return false;}int main() {int t;scanf("%d",&t);while(t–) {scanf("%d%d%d",&n,&m,&limit);for(int i=0; i<n; i++)scanf("%s",mp[0][i]);for(int i=0; i<n; i++)scanf("%s",mp[1][i]);for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {if(mp[0][i][j]=='#'&&mp[1][i][j]=='#')mp[0][i][j]=mp[1][i][j]='*';if(mp[0][i][j]=='#'&&mp[1][i][j]=='*')mp[0][i][j]=mp[1][i][j]='*';if(mp[0][i][j]=='*'&&mp[1][i][j]=='#')mp[0][i][j]=mp[1][i][j]='*';}}memset(vis,0,sizeof(vis));if(bfs()) puts("YES");else puts("NO");}return 0;}

有本钱耍个性,离开睁眼闭眼看见的城市,逃离身边的纷纷扰扰,

HDU 2102 A计划 (三维的迷宫BFS)

相关文章:

你感兴趣的文章:

标签云: