经典的广搜问题
-
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 <math.h> #include <queue> int ma[6][6],rr=3,rc=1,mr=3,mc=3,cr=5,cc=5,s=0,f=0,num[6][6][6][6],b[4][2]={ 0,1, 0,-1, 1,0, -1,0 }; using namespace std; struct mu{ int rrow; int rcol; int mrow; int mcol; }; int isGo(mu m,int i){ if(i==0){ if(ma[m.rrow][m.rcol]==2) return 0; } if(i==2){ if(ma[m.rrow][m.rcol]==1){ return 0; } } return 1; } mu go(mu m,int i){ m.rrow+=b[i][0]; m.rcol+=b[i][1]; return m; } mu mgo(mu m){ int n=2; while(n!=0){ n--; if(m.rcol>m.mcol){ if(ma[m.mrow][m.mcol]!=2) m.mcol++; } else{ if(m.rcol<m.mcol){ m.mcol--; } else { if(m.rcol==m.mcol){ if(m.mrow<m.rrow) { if(ma[m.mrow][m.mcol]!=1) m.mrow++; } else{ if(m.mrow>m.rrow){ m.mrow--; } else{ if(m.mrow==m.rrow) s=1; } } } } } } return m; } int isAim(mu m){ if(m.rrow==cr && m.rcol==cc) return 1; else return 0; } int iskeyi(mu m){ if(m.rrow<6 && m.rrow>=0 && m.rcol<6 && m.rcol>=0) return 1; else return 0; } int isSafe(mu m){ if(m.mcol==m.rcol && m.mrow==m.rrow) return 0; else return 1; } int isNew(mu m){ if(num[m.rrow][m.rcol][m.mrow][m.mcol]==1) return 0; else return 1; } void fd(){ mu fir,m,newm; queue<mu> que; int i; fir.rcol=rc; fir.rrow=rr; fir.mrow=mr; fir.mcol=mc; que.push(fir); while(!que.empty()){ m=que.front(); que.pop(); for(i=0;i<4;i++){ if(isGo(m,i)==0) continue; newm=go(m,i); if(isAim(newm)==1){ f=1; return; } if(iskeyi(newm)==1){ newm=mgo(newm); if(isSafe(newm)==1){ if(isNew(newm)==1){ num[newm.rrow][newm.rcol][newm.mrow][newm.mcol]=1; que.push(newm); } } } } } } int main() { int i,n,a,b,c; cin>>n; for(i=0;i<n;i++){ cin>>a>>b>>c; if(c==0) ma[a][b]=2; else ma[a][b]=1; } cin>>mr>>mc; cin>>rr>>rc; cin>>cr>>cc; fd(); if(rr==cr && rc==cc) f=1; if(mr==rr && mc==rc) f=0; if(f==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }