• Maze(迷宫)


    poj 2157

    题目大意:S是起点,G是 终点,"."是可走的路,“X”是不可走的路

    解决:BFS 本题有些难度,因为若为钥匙,将钥匙吃了之后,将这个点变为“.”,若为门,判断是否对应该门的钥匙都拿到手了,若都拿到手了,可以将这个门打开,即变为“.”,否则,等这个点周围的所有点都进队列后,若队列为空说明路都走过了,一定无法通过,若队列非空,说明还有其他的路可以走,将这个点入队列,一会等着把钥匙都得到了,在出队列判断。

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    char map[22][22];
    int m,n;
    int sx,sy;
    bool found;
    int dx[]={1,0,-1,0};
    int dy[]={0,1,0,-1};
    int key[5];
    struct node
    {
        int x,y;
        node(int xx,int yy){x=xx;y=yy;}
        node(){};
    };
    bool bfs()
    {
        queue<node> q;
        q.push(node(sx,sy));
        map[sx][sy]='X';
        node now,next;
        char c;
        bool flag=false;
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                next=node(now.x+dx[i],now.y+dy[i]);
                if(next.x>=0 && next.x<m && next.y>=0 && next.y<n)
                {
                    c=map[next.x][next.y]; 
                    if(c=='G')return true;
                    if(c>='a' && c<='e')
                    {//是钥匙的话,钥匙个数减1
                        key[c-'a']--;
                        map[next.x][next.y]='X';
                        q.push(next);
                    }
                    else if(c>='A' && c<='E')
                    {//若为锁,判断钥匙数是否为0,为0的话,打开门,否则,标记下,等着其他的点进队
                        if(!key[c-'A']){map[next.x][next.y]='X';q.push(next);}
                        else flag=true;
                    }
                    else if(c=='.')
                    {
                        map[next.x][next.y]='X';
                        q.push(next);
                    }
                }
            }
            if(flag)
            {//若其他的点进队后,仍然为空,没路了,否则,入队列,等待下次判断
              if(q.empty())return false;
              else {flag=false; q.push(now);}
            }
        }
        return false;
    }
    int main()
    {
       
        while(scanf("%d%d",&m,&n),n||m)
        {
          key[0]=key[1]=key[2]=key[3]=key[4]=0;
          getchar();
          for(int i=0;i<m;i++)scanf("%s",map[i]);
          for(int i=0;i<m;i++)
             for(int j=0;j<n;j++)
             {
                     if(map[i][j]=='S'){sx=i;sy=j;}
                     else if(map[i][j]>='a' && map[i][j]<='e')key[map[i][j]-'a']++;
             }
             
           if(bfs() )puts("YES");
           else puts("NO");
        }
        system("pause");
        return 0;
    }
    

  • 相关阅读:
    linux向下向上查找
    安卓中的线程
    安卓 新浪微博随便看看
    平面图的基本概念及性质
    软件工程知识点总结
    磁盘阵列RAID原理、种类及性能优缺点对比
    面试题之------三次握手与四次挥手过程
    不忘初心
    考研彼岸,花开馨香
    In和Out指令
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2155401.html
Copyright © 2020-2023  润新知