木乃伊迷宫

经典的广搜问题

  •    
       

    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;
    
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值