1147.木乃伊迷宫
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
木乃伊地下宫殿是一个6行6列的迷宫。游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会向你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。
输入
先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。
输出
如果能安全逃生则输出Yes,否则输出No,答案占一行。
新鲜出炉的第二版代码(更简洁清晰明了):
#include <iostream>
#include <queue>
using namespace std;
int n;
int maze[6][6][2]; //存储迷宫的墙
struct node
{
int mx,my; //木乃伊位置
int px,py; //人位置
bool useful; //这个节点是否有效
}; //无效条件:越界、重复、被抓
node start,target;
queue <node> q1;
int used[6][6][6][6]; //判重
int walk[4][2]= //返回人走一格的新位置坐标
{
0, -1, //左
+1, 0, //下
0, +1, //右
-1, 0 //上
};
void input(); //输入函数
bool bfs();
node moveto(node cur, int i); //返回节点cur扩展的下一个节点next
bool isWall(int x, int y, int i); //判断方格[x,y]方向是否是墙
int main()
{
input();
if(bfs())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
void input()
{
//第一行
cin>>n;
//第二行
int i,j,x;
for(int k=0; k<n; k++)
{
cin>>i>>j>>x;
maze[i][j][x]=1; //1代表是墙
}
//最后三行
cin>>start.mx>>start.my;
cin>>start.px>>start.py;
cin>>target.px>>target.py;
//初始节点标记并入队
used[start.mx][start.my][start.px][start.px]=1;
q1.push(start);
}
bool bfs()
{
node cur,next;
while(!q1.empty())
{
cur=q1.front();
q1.pop();
for(int i=0; i<4; i++) //人要向四个方向试探
{
next=moveto(cur, i); //获取扩展得到的下