题目链接:传送门
题意:
三维的一个迷宫,起点在第一层的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; }