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

木乃伊迷宫

时限: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 #include using namespace std; struct position { queuerow; queuecol; }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"< } if(result==0) { cout<<"No"< } return 0;  } void readdate(int m) { int a,b,c,i; for(i=0;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]; }

你可能感兴趣的:(C语言 木乃伊迷宫 队列,广搜,map函数)