A计划
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
三维bfs遍历,求最短路径
用vis数组存放每个点的最短路径
要注意“#”的传送问题
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <vector> #include <cctype> #include <cstdlib> #include <set> #include <map> #include <queue> #include <deque> #include <list> #include <stack> #include <ctime> #include <bitset> #include <algorithm> using namespace std; const int maxn = 1e5 + 10; const int MOD = 1e9 + 7; const double PI = acos(-1.0); const double esp = 1e-5; const double e = 2.718281828459; const int INF = 0x3f3f3f3f; typedef long long ll; typedef unsigned long long ull; #define cl(A) memset(A,0,sizeof A); #define fin freopen("in.txt","r",stdin) #define fout freopen("out.txt","w",stdout) char mp[2][11][11]; int vis[2][11][11]; int sx,sy,sz,ex,ey,ez; int dx[] = {-1,0,1,0}; int dy[] = {0,1,0,-1}; struct node { int x,y,z; node(){} node(int xx,int yy,int zz):x(xx),y(yy),z(zz){} }p; int flag=0; int n,m,t; void bfs(int x,int y,int zm) { queue<node> q; cl(vis); q.push(node(sx,sy,sz)); vis[sz][sx][sy] = 1; while(q.size()){ p = q.front(); q.pop(); if(p.x==ex&&p.y==ey&&p.z==ez){ // puts("YES"); return ; } if(mp[p.z][p.x][p.y]=='#'){ p.z = 1-p.z; vis[p.z][p.x][p.y] = vis[1-p.z][p.x][p.y]; } if(mp[p.z][p.x][p.y]!='*'&&mp[p.z][p.x][p.y]!='#') for(int i=0;i<4;i++){ int nx = p.x+dx[i]; int ny = p.y+dy[i]; int nz = p.z; if(0<=nx&&nx<n&&0<=ny&&ny<m&&mp[nz][nx][ny]!='*'&&!vis[nz][nx][ny]){ q.push(node(nx,ny,nz)); vis[nz][nx][ny] = 1 + vis[p.z][p.x][p.y]; } } } } int main() { int T; scanf("%d",&T); while(T--){ cl(mp); scanf("%d%d%d",&n,&m,&t); 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<2;i++){ for(int j=0;j<n;j++){ for(int k=0;k<m;k++){ if(mp[i][j][k] == 'S'){ sz = i; sx = j; sy = k; } if(mp[i][j][k] == 'P'){ ez = i; ex = j; ey = k; } } } } bfs(sz,sx,sy); // for(int k=0;k<2;k++) // for(int i=0;i<n;i++){ // for(int j=0;j<m;j++){ // cout<<vis[k][i][j]<<" "; // } // cout<<endl; // } if(!vis[ez][ex][ey]){ puts("NO"); } else { if(vis[ez][ex][ey] - 1 <= t)puts("YES"); else puts("NO"); } } return 0; }