【算法实验三】(BFS-分支限界)【木乃伊迷宫】
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-分支限界)【木乃伊迷宫】相关推荐
- 算法实验三 Problem F木乃伊迷宫
Problem F 木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的 ...
- NOJ1042——算法实验三——电子老鼠闯迷宫
电子老鼠闯迷宫 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路.电子老鼠可以在路上向上.下.左.右行走,每一步走一个格子.现给定一 ...
- 算法实验三 【电子老鼠闯迷宫】分支限界
算法实验三 [电子老鼠闯迷宫]分支限界 1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元 ...
- 【NOJ1147】【算法实验三】木乃伊迷宫
1147.木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵! ...
- 【NOJ1147】【算法实验三】【分支限界法】木乃伊迷宫
1147.木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口.你一次只能走一步 ...
- 【NOJ1042】【算法实验三】电子老鼠闯迷宫
1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部 ...
- 算法实验三 Problem B电子老鼠闯迷宫
Problem B 电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建 ...
- 【NOJ1571】【算法实验三】【分支限界法】八数码
1571.八数码 时限:5000ms 内存限制:20000K 总时限:10000ms 描述 在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几 ...
- 【NOJ1326】【算法实验三】推箱子
1326.推箱子 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 绝大多数人都玩过推箱子的游戏,控制一个人将箱子推动到目标位置即获得胜利.现请你编写一个程序,判断将箱子推到目标 ...
最新文章
- 全国四级网络工程师操作系统部分考纲
- STL Algorithms 之 unique
- 一季度网络支付58万亿,腾讯金融用户渗透率达89.2%
- python中的解析式是什么_初学python之解析式
- 孤立森林异常检测之入门
- SSM实现个人博客-day01
- beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会
- 硬核|定时任务的10种实现方案,满足你的不同需求!
- 【kafka】Kafka扩容
- php连接数据库配置优化,小蚂蚁学习mysql性能优化(9)--操作系统配置优化--mysql配置文件优化...
- 2019 renew 博客目录
- 论文查重率多少合格?
- 命令行窗口光标消失问题解决
- 华为p10测试软件,华为p10内存测试软件
- Flutter 路由源码解析
- 7-1 计算职工工资
- DTCloud—QWeb
- 202203 word中的表格 实现 外框线粗 内部线细
- Golang之上下文Context
- Go语言中Time的用法[1]