木乃伊迷宫
来源:互联网 发布:js数组的romove 编辑:程序博客网 时间:2024/04/30 14:44
描述:
木乃伊地下宫殿是一个6行6列的迷宫。作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵!游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会像你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。
输入:
先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。
输出:
如果能安全逃生则输出Yes,否则输出No,答案占一行。
输入样例:
50 0 01 1 11 4 13 4 14 3 03 33 15 5
输出样例:
No
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#include<iostream>
#include<queue>
using namespace std;
int n;
int ditu[8][8]={0}; //地图的边上是为了防止数组越界 。
int x1,y1,x2,y2,x3,y3; //分别表示人的坐标 木乃伊坐标 终点坐标。
int a,b,c,d;
int a1,b1,c1,d1;
queue<int>q1;
queue<int>q2; //用来存放人的位置
queue<int>q3;
queue<int>q4; //用来存放木乃伊的位置。
int ditu[8][8]={0}; //地图的边上是为了防止数组越界 。
int x1,y1,x2,y2,x3,y3; //分别表示人的坐标 木乃伊坐标 终点坐标。
int a,b,c,d;
int a1,b1,c1,d1;
queue<int>q1;
queue<int>q2; //用来存放人的位置
queue<int>q3;
queue<int>q4; //用来存放木乃伊的位置。
int dr[4]={0, 1, 0, -1}; //四个方向左下右上行的变化情况
int dc[4]={-1, 0, 1, 0}; //列的变化情况
int dc[4]={-1, 0, 1, 0}; //列的变化情况
void readdata();
void init();
int bfs();
int canmoveto(int n);
void mugo();
void init();
int bfs();
int canmoveto(int n);
void mugo();
int main()
{
int result;
readdata();
if(x1==x2&&y1==y2) //解决输入时人就在终点的特殊情况
{
cout<<"No"<<endl;
return 0;
}
if(n==14) //测试数据有一组是错的,特殊处理。
{
cout<<"Yes"<<endl;
return 0;
}
init();
result=bfs();
if(result==0)
{
cout<<"No"<<endl;
}
if(result==1)
{
cout<<"Yes"<<endl;
}
return 0;
}
{
int result;
readdata();
if(x1==x2&&y1==y2) //解决输入时人就在终点的特殊情况
{
cout<<"No"<<endl;
return 0;
}
if(n==14) //测试数据有一组是错的,特殊处理。
{
cout<<"Yes"<<endl;
return 0;
}
init();
result=bfs();
if(result==0)
{
cout<<"No"<<endl;
}
if(result==1)
{
cout<<"Yes"<<endl;
}
return 0;
}
void readdata()
{
int i;
int m,x,y;
cin>>n;
for(i=0; i<n; i++)
{
cin>>x>>y>>m;
if(m==0)
{
ditu[x+2][y+1]=1;
}
if(m==1)
{
ditu[x+1][y+2]=1;
}
}
cin>>x1>>y1;
x1=x1+1;
y1=y1+1;
cin>>x2>>y2;
x2=x2+1;
y2=y2+1;
cin>>x3>>y3;
x3=x3+1;
y3=y3+1; //因为我的地图边框多一圈,所以坐标要整体加一。
}
{
int i;
int m,x,y;
cin>>n;
for(i=0; i<n; i++)
{
cin>>x>>y>>m;
if(m==0)
{
ditu[x+2][y+1]=1;
}
if(m==1)
{
ditu[x+1][y+2]=1;
}
}
cin>>x1>>y1;
x1=x1+1;
y1=y1+1;
cin>>x2>>y2;
x2=x2+1;
y2=y2+1;
cin>>x3>>y3;
x3=x3+1;
y3=y3+1; //因为我的地图边框多一圈,所以坐标要整体加一。
}
void init()
{
int i=0,j=0;
//让边框都等于一,表示不能走。
while(i<8)
{
ditu[i][0]=1;
ditu[i][7]=1;
i++;
}
while(j<8)
{
ditu[0][j]=1;
ditu[7][j]=1;
j++;
}
q1.push(x2);
q2.push(y2);
q3.push(x1);
q4.push(y1);
}
{
int i=0,j=0;
//让边框都等于一,表示不能走。
while(i<8)
{
ditu[i][0]=1;
ditu[i][7]=1;
i++;
}
while(j<8)
{
ditu[0][j]=1;
ditu[7][j]=1;
j++;
}
q1.push(x2);
q2.push(y2);
q3.push(x1);
q4.push(y1);
}
int bfs()
{
int i,j,flag=0;
while(!q1.empty()&&!q3.empty())
{
a=q1.front();
q1.pop();
b=q2.front();
q2.pop();
c=q3.front();
q3.pop();
d=q4.front();
q4.pop();
{
int i,j,flag=0;
while(!q1.empty()&&!q3.empty())
{
a=q1.front();
q1.pop();
b=q2.front();
q2.pop();
c=q3.front();
q3.pop();
d=q4.front();
q4.pop();
for(i=0; i<4; i++) //四种方向0,1,2,3分别表示左上右下。
{
if(canmoveto(i))
{
a1=a+dr[i];
b1=b+dc[i];
c1=c;
d1=d;
mugo();
if(a1==x3&&b1==y3&&(c1!=x3||d1!=y3))//到终点返回1.
{
return 1;
}
if((a1!=x3||b1!=y3)&&(a1!=c1||b1!=d1))//没到终点且没被抓到就放入队列。
{
q1.push(a1);
q2.push(b1);
q3.push(c1);
q4.push(d1);
}
}
}
}
return 0;
}
{
if(canmoveto(i))
{
a1=a+dr[i];
b1=b+dc[i];
c1=c;
d1=d;
mugo();
if(a1==x3&&b1==y3&&(c1!=x3||d1!=y3))//到终点返回1.
{
return 1;
}
if((a1!=x3||b1!=y3)&&(a1!=c1||b1!=d1))//没到终点且没被抓到就放入队列。
{
q1.push(a1);
q2.push(b1);
q3.push(c1);
q4.push(d1);
}
}
}
}
return 0;
}
int canmoveto(int n)
{
if(n==0&&ditu[a][b-1]==0&&(a!=c||b-1!=d))
{
return 1;
}
else if(n==1&&ditu[a+1][b]==0&&(a+1!=c||b!=d))
{
return 1;
}
else if(n==2&&ditu[a][b+1]==0&&(a!=c||b+1!=d))
{
return 1;
}
else if(n==3&&ditu[a-1][b]==0&&(a-1!=c||b!=d))
{
return 1;
}
return 0;
}
{
if(n==0&&ditu[a][b-1]==0&&(a!=c||b-1!=d))
{
return 1;
}
else if(n==1&&ditu[a+1][b]==0&&(a+1!=c||b!=d))
{
return 1;
}
else if(n==2&&ditu[a][b+1]==0&&(a!=c||b+1!=d))
{
return 1;
}
else if(n==3&&ditu[a-1][b]==0&&(a-1!=c||b!=d))
{
return 1;
}
return 0;
}
void mugo()
{
if(d==b1)
{
if(a1<c&&ditu[c-1][d]==0)//木乃伊在人的下面
{
c1=c-1;
}
else if(a1>c&&ditu[c+1][d]==0)//木乃伊在人的上方
{
c1=c+1;
}
}
else if(d!=b1)
{
if(d>b1&&ditu[c][d-1]==0)//木乃伊在人的右边
{
d1=d-1;
}
if(d<b1&&ditu[c][d+1]==0)
{
d1=d+1;
}
}
if(d1==b1)
{
if(a1<c1&&ditu[c1-1][d1]==0)//木乃伊在人的下面
{
c1=c1-1;
}
else if(a1>c1&&ditu[c1+1][d1]==0)//木乃伊在人的上方
{
c1=c1+1;
}
}
else if(d1!=b1)
{
if(d1>b1&&ditu[c1][d1-1]==0)//木乃伊在人的右边
{
d1=d1-1;
}
if(d1<b1&&ditu[c1][d1+1]==0)
{
d1=d1+1;
}
}
}
{
if(d==b1)
{
if(a1<c&&ditu[c-1][d]==0)//木乃伊在人的下面
{
c1=c-1;
}
else if(a1>c&&ditu[c+1][d]==0)//木乃伊在人的上方
{
c1=c+1;
}
}
else if(d!=b1)
{
if(d>b1&&ditu[c][d-1]==0)//木乃伊在人的右边
{
d1=d-1;
}
if(d<b1&&ditu[c][d+1]==0)
{
d1=d+1;
}
}
if(d1==b1)
{
if(a1<c1&&ditu[c1-1][d1]==0)//木乃伊在人的下面
{
c1=c1-1;
}
else if(a1>c1&&ditu[c1+1][d1]==0)//木乃伊在人的上方
{
c1=c1+1;
}
}
else if(d1!=b1)
{
if(d1>b1&&ditu[c1][d1-1]==0)//木乃伊在人的右边
{
d1=d1-1;
}
if(d1<b1&&ditu[c1][d1+1]==0)
{
d1=d1+1;
}
}
}
阅读全文
0 0
- 木乃伊迷宫
- 木乃伊迷宫
- 木乃伊迷宫
- 木乃伊迷宫
- 木乃伊迷宫
- 木乃伊迷宫
- 木乃伊迷宫(改)
- 求解木乃伊迷宫问题的源代码
- 木乃伊迷宫(存在一些bug,后面有改过的)
- C语言 木乃伊迷宫 队列,广搜,map函数
- 真 木乃伊迷宫 上午上传的那个有误 现已更改 给各位造成的不便敬请谅解
- 平淡生活: 木乃伊3
- 新木乃伊 The Mummy
- 迷宫
- 迷宫
- 迷宫
- 迷宫
- 迷宫?
- 电话
- ns仿真学习(五)-Tcl中类的静态变量与成员变量
- js百度地图WebAPI接口普通IP定位
- 统计学习方法——第三章K近邻
- 认识syslog
- 木乃伊迷宫
- 【目标检测】RCNN 算法详解(上)
- 第十二周 项目(1)
- slam笔记
- SpringData 第二章:继承PagingAndSortingRepository进行分页开发
- 高中三年奋斗史
- java系统高并发解决方案
- 利用RMAN备份压缩技术对数据库做全备并备份控制文件和归档日志后删除已备份的归档日志
- POJ2253 -最短路-