C语言 木乃伊迷宫 队列,广搜,map函数

来源:互联网 发布:大数据交易交易的是啥 编辑:程序博客网 时间:2024/05/21 11:01

木乃伊迷宫

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

描述:

木乃伊地下宫殿是一个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<iostream>#include<queue>using namespace std;struct position{queue<int>row;queue<int>col;}mu,man;struct location{int r,c;}mny,ren;int dr[4]={0,-1,0,1};int dc[4]={-1,0,1,0};int used[6][6][6][6]={0}; int map[6][6]={0};int x1,x2,x3,y1,y2,y3,dire,flag;void readdate(int m);void init();int bfs();int mancanmove(int row,int col,int dir);int mucanmove(int row,int col);void manmove(int row,int col,int dir);void mumove(int row,int col);int main(){int n,result=-1;cin>>n;readdate(n);init();result=bfs();if(result==1){cout<<"Yes"<<endl;}if(result==0){cout<<"No"<<endl;}return 0; }void readdate(int m){int a,b,c,i;for(i=0;i<m;i++){cin>>a>>b>>c;if(c==0){map[a+1][b]=1;}if(c==1){map[a][b+1]=1;}}}void init(){cin>>x1>>y1;cin>>x2>>y2;cin>>x3>>y3;mu.row.push(x1);mu.col.push(y1);man.row.push(x2);man.col.push(y2);map[x3][y3]=2;used[x2][y2][x1][y1]=1;}int bfs(){int r,c,i;while(!man.row.empty()){ren.r=man.row.front();man.row.pop();ren.c=man.col.front();man.col.pop();mny.r=mu.row.front();mu.row.pop();mny.c=mu.col.front();mu.col.pop();r=ren.r;c=ren.c;if(ren.r==x3&&ren.c==y3){return 1;}for(i=0;i<4;i++){if(mancanmove(ren.r,ren.c,i)){manmove(ren.r,ren.c,i);if(mucanmove(mny.r,mny.c)){mumove(mny.r,mny.c);}if(mny.r==ren.r&&mny.c==ren.c){flag=1;continue;}if(mucanmove(mny.r,mny.c)){mumove(mny.r,mny.c);}if(mny.r==ren.r&&mny.c==ren.c){flag=1;continue;}if(used[ren.r][ren.c][mny.r][mny.c]==0){mu.row.push(mny.r);mu.col.push(mny.c);man.row.push(ren.r);man.col.push(ren.c);used[ren.r][ren.c][mny.r][mny.c]=1;}}}}if(flag==0){return 1;}else{return 0;}}int mancanmove(int row,int col,int dir){int r,c;r=row+dr[dir];c=col+dc[dir];if(r<0||r>5||c<0||c>5){return 0;}if(map[r][c]==1){return 0;}if(r==mny.r&&c==mny.c){flag=1;return 0;}return 1;}int mucanmove(int row,int col){int r,c;if(col-ren.c>0){dire=0;}if(col-ren.c<0){dire=2;}if(col-ren.c==0){if(row-ren.r>0){dire=1;}else{dire=3;}}r=row+dr[dire];c=col+dc[dire];if(map[r][c]==1){return 0;}if(r<0||r>5||c<0||c>5){return 0;}return 1;}void manmove(int row,int col,int dir){ren.r=row+dr[dir];ren.c=col+dc[dir];}void mumove(int row,int col){mny.r=row+dr[dire];mny.c=col+dc[dire];}