木乃伊迷宫

时限: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;

}
发布了105 篇原创文章 · 获赞 53 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zhao2018/article/details/83146594