1147.木乃伊迷宫

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

木乃伊地下宫殿是一个6行6列的迷宫。作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵!游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会像你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。

输入

先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。

输出

如果能安全逃生则输出Yes,否则输出No,答案占一行。

输入样例

5
0 0 0
1 1 1
1 4 1
3 4 1
4 3 0
3 3
3 1
5 5

输出样例

No

#include <iostream>
#include <queue>
using namespace std;
/**************************/
int n;
int maze[6][6][2];  //存储迷宫的墙
struct state
{int mx,my;  //木乃伊int px,py;  //人bool useful;    //这个节点是否有效
};                  //无效条件:越界、重复、被抓state start,target;
queue <state> q;
int used[6][6][6][6];   //判重
int walk[4][2]=     //人走一格
{0, -1,  //左+1, 0,  //下0, +1,  //右-1, 0   //上
};
/**************************/
void init();
bool bfs();
state move(state cur, int i);   //返回节点cur扩展的下一个节点next
bool isWall(int x, int y, int i);   //判断方格[x,y]方向是否是墙
/*************************/
int main()
{init();if(bfs()){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}return 0;
}void init()
{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;q.push(start);
}bool bfs()
{state now,next;while(!q.empty()){now=q.front();q.pop();for(int i=0; i<4; i++)  {next=move(now, i);    if(next.useful==true)   {if(next.px==target.px&&next.py==target.py)  {return true;}else    {q.push(next);}}}}return false;
}//人要向i方向走一步,木乃伊要向人靠近两步
//节点无效条件:人越界、人撞墙、人被木乃伊抓到、节点next重复
state move(state now, int i)
{state next;next.px=now.px+walk[i][0];  next.py=now.py+walk[i][1];if((next.px<0||next.px>=6||next.py<0||next.py>=6)||(isWall(now.px, now.py, i)))           {next.useful=false;  //该节点无效,直接返回return next;}//木乃伊走两步next.mx=now.mx;next.my=now.my;int step=2;while(step--){//若列数不相等,则先到达同一列if(next.py>next.my&&!isWall(next.mx, next.my, 2)){next.my++;}else if(next.py<next.my&&!isWall(next.mx, next.my, 0)){next.my--;}//若列数相等,则再到达同一行else if(next.py==next.my){if(next.px>next.mx&&!isWall(next.mx, next.my, 1)){next.mx++;}else if(next.px<next.mx&&!isWall(next.mx, next.my, 3)){next.mx--;}//若同行同列else if(next.px==next.mx){//cout<<next.px<<' '<<next.py<<"catch"<<endl;next.useful=false;return next;}}}if(used[next.mx][next.my][next.px][next.py])   {//cout<<next.px<<' '<<next.py<<"used"<<endl;next.useful=false;}else{used[next.mx][next.my][next.px][next.py]=1; next.useful=true;                           }return next;
}bool isWall(int x, int y, int i)
{switch(i){case 0:     //向左走return maze[x][y-1][1]; //判断左边的方格的右侧是否是墙case 1:     //向下走return maze[x][y][0];   //判断本格的下侧是否是墙case 2:     //向右走return maze[x][y][1];   //判断本格的右侧是否是墙case 3:     //向上走return maze[x-1][y][0]; //判断上边的方格的下侧是否是墙}return -1;
}

【算法实验三】(BFS-分支限界)【木乃伊迷宫】相关推荐

  1. 算法实验三 Problem F木乃伊迷宫

    Problem F 木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的 ...

  2. NOJ1042——算法实验三——电子老鼠闯迷宫

    电子老鼠闯迷宫 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路.电子老鼠可以在路上向上.下.左.右行走,每一步走一个格子.现给定一 ...

  3. 算法实验三 【电子老鼠闯迷宫】分支限界

    算法实验三 [电子老鼠闯迷宫]分支限界 1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元 ...

  4. 【NOJ1147】【算法实验三】木乃伊迷宫

    1147.木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵! ...

  5. 【NOJ1147】【算法实验三】【分支限界法】木乃伊迷宫

    1147.木乃伊迷宫 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口.你一次只能走一步 ...

  6. 【NOJ1042】【算法实验三】电子老鼠闯迷宫

    1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部 ...

  7. 算法实验三 Problem B电子老鼠闯迷宫

    Problem B 电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建 ...

  8. 【NOJ1571】【算法实验三】【分支限界法】八数码

    1571.八数码 时限:5000ms 内存限制:20000K  总时限:10000ms 描述 在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几 ...

  9. 【NOJ1326】【算法实验三】推箱子

    1326.推箱子 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 绝大多数人都玩过推箱子的游戏,控制一个人将箱子推动到目标位置即获得胜利.现请你编写一个程序,判断将箱子推到目标 ...

最新文章

  1. 全国四级网络工程师操作系统部分考纲
  2. STL Algorithms 之 unique
  3. 一季度网络支付58万亿,腾讯金融用户渗透率达89.2%
  4. python中的解析式是什么_初学python之解析式
  5. 孤立森林异常检测之入门
  6. SSM实现个人博客-day01
  7. beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会
  8. 硬核|定时任务的10种实现方案,满足你的不同需求!
  9. 【kafka】Kafka扩容
  10. php连接数据库配置优化,小蚂蚁学习mysql性能优化(9)--操作系统配置优化--mysql配置文件优化...
  11. 2019 renew 博客目录
  12. 论文查重率多少合格?
  13. 命令行窗口光标消失问题解决
  14. 华为p10测试软件,华为p10内存测试软件
  15. Flutter 路由源码解析
  16. 7-1 计算职工工资
  17. DTCloud—QWeb
  18. 202203 word中的表格 实现 外框线粗 内部线细
  19. Golang之上下文Context
  20. Go语言中Time的用法[1]

热门文章

  1. whois查询 查询域名whois的工具
  2. SUV,MPV,RV概念
  3. 解决 linux 无法创建、删除用户问题
  4. 如何在浏览器中使用TOR
  5. 学术前沿 | DMSP-OLS夜间城市灯光数据文献综述
  6. 数字逻辑电路——二进制编码
  7. linux 安装报错 make FORCE_UNSAFE_CONFIGURE=1
  8. 微博开放平台接口整理系列--短链转长链
  9. 浏览器启动页被劫持篡改问题解决
  10. 共识与拜占庭将军问题