可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
#include<cstdio>
#include<cstring>
#include<queue> //队列
#include<stdlib.h>
#include<algorithm>
using namespace std;
char maze[2][15][15];
int vis[2][15][15];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int c,n,m,o;
int flag;
struct node
{
int x,y,z,t;
};
queue<node>q; //队列存放node型
void bfs()
{
node no;
int x=0,y=0,z=0,time=0,i,t=0;
vis[0][0][0]=1;
no.x=0;no.y=0;no.z=0;no.t=0;
q.push(no);
while(!q.empty())
{
no=q.front();
if(no.t<=o && maze[no.z][no.x][no.y]=='P')
{
flag=1;
return;
}
else if(no.t>o)
return;
for(i=0;i<4;i++)
{
x=no.x+dir[i][0];
y=no.y+dir[i][1];
z=no.z;
time=no.t+1;
if(x>=0 && x<n && y>=0 && y<m)
{
if(maze[z][x][y]=='#' && !vis[z][x][y])
{
if(maze[!z][x][y]!='#' && !vis[z][x][y] && maze[!z][x][y]!='*')
{
node pp;
pp.x=x;pp.y=y;pp.z=!z;pp.t=time;
vis[z][x][y]=1;
q.push(pp);//入队
}
}
else if(maze[z][x][y]=='.' || maze[z][x][y]=='P')
{
if(!vis[z][x][y])
{
node pp;
pp.x=x;pp.y=y;pp.t=time;pp.z=z;
vis[z][x][y]=1;
q.push(pp);
}
}
}
}
q.pop();//出队
}
}
int main()
{
int i,j,k;
scanf("%d",&c);
while(c--)
{
flag=0;
while(!q.empty()) q.pop(); //清空队列
scanf("%d%d%d",&n,&m,&o);
for(i=0;i<2;i++)
for(j=0;j<n;j++)
scanf("%s",maze[i][j]);
memset(vis,0,sizeof(vis));
bfs();
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
本文介绍了一个迷宫救援问题的解决方案,使用广度优先搜索算法(BFS)帮助骑士找到解救公主的最佳路径。迷宫由两层组成,包含时空传输机等元素。文章详细解释了如何实现算法,并给出了代码示例。
2281

被折叠的 条评论
为什么被折叠?



