• POJ 1475 Pushing Boxes 搜索- 两重BFS


    题目地址: http://poj.org/problem?id=1475


    两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方。


    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <list>
    #include <deque>
    #include <queue>
    #include <iterator>
    #include <stack>
    #include <map>
    #include <set>
    #include <algorithm>
    #include <cctype>
    using namespace std;
    
    typedef long long LL;
    const int N=21;
    const LL II=1000000007;
    
    
    int r,c,begx,begy,endx,endy,begsx,begsy;
    char maps[21][21];
    int t[4][2]={-1,0,1,0,0,1,0,-1};
    char P[4]={'N', 'S', 'E', 'W'};
    char M[4]={'n', 's', 'e', 'w'};
    int mark[21][21];
    
    struct xhr
    {
        int x,y;
        string ans;
    }F,G;
    
    struct xhx
    {
        int bx,by,px,py;
        string ans;
    }f,g;
    
    bool inmap(int x,int y)
    {
        return x>=1&&x<=r&&y>=1&&y<=c;
    }
    
    bool ren(int bx,int by,int ex,int ey)//人bfs
    {
        queue<xhr> P;
        bool Mark[21][21];
        memset(Mark,0,sizeof(Mark));
        Mark[bx][by]=1;
        Mark[f.bx][f.by]=1;
        F.x=bx;   F.y=by;
        F.ans="";
        if(bx==ex&&by==ey)
            return true;
        P.push(F);
        while(!P.empty())
        {
            F=P.front();
            P.pop();
            for (int i=0;i<4;i++)
            {
                G.x=F.x+t[i][0];
                G.y=F.y+t[i][1];
                if(!inmap(G.x, G.y)||maps[G.x][G.y]=='#')   continue;
                if(!Mark[G.x][G.y])
                {
                    Mark[G.x][G.y]=1;
                    G.ans=F.ans+M[i];
                    if(G.x==ex&&G.y==ey)
                    {
                        F=G;
                        return true;
                    }
                    P.push(G);
                }
            }
        }
        return false;
    }
    
    void bfs()//箱子bfs
    {
        int i;
        queue<xhx> Q;
        f.bx=begx;    f.by = begy;
        f.px=begsx;   f.py = begsy;
        f.ans="";
        mark[begx][begy]=1;
        Q.push(f);
        while (!Q.empty())
        {
            f=Q.front();
            Q.pop();
            for (i=0;i<4;i++)
            {
                int newx=f.bx+t[i][0],newy=f.by+t[i][1];//箱子要到达的地方
                int tx=f.bx-t[i][0],ty=f.by-t[i][1];//人要到达的地方
                if (!inmap(newx, newy)||maps[newx][newy]=='#'||!inmap(tx, ty)||maps[tx][ty]=='#'||mark[newx][newy])
                    continue;
                if (ren(f.px,f.py,tx,ty))
                {
                    g.bx=newx;  g.by=newy;
                    g.px=f.bx;  g.py=f.by;
                    g.ans=f.ans+F.ans+P[i];
                    if(g.bx==endx&&g.by==endy)
                    {
                        cout<<g.ans<<endl<<endl;
                        return ;
                    }
                    mark[newx][newy]=1;
                    Q.push(g);
                }
            }
        }
        printf("Impossible.
    
    ");
    }
    
    int main()
    {
        int ci=1,i,j;
        while(scanf("%d%d",&r,&c)&&(r + c))
        {
            memset(mark,0,sizeof(mark));
            for (i=1;i<=r;++i)
                scanf("%s",maps[i]+1);
            for (i=1;i<=r;++i)
                for (j=1;j<=c;++j)
                {
                    if(maps[i][j]=='B') begx=i, begy=j;
                    if(maps[i][j]=='T') endx=i, endy=j;
                    if(maps[i][j]=='S') begsx=i, begsy=j;
                }
            printf("Maze #%d
    ",ci++);
            bfs();
        }
        return 0;
    }
    


  • 相关阅读:
    【python37--面向对象】
    【python36--对象】
    流畅的python,Fluent Python 第十九章笔记 (动态属性和特性)
    流畅的python,Fluent Python 第十八章笔记 (使用asyncio包处理并发)
    Python异常的处理记录
    Python 生成器与它的 send,throw,close 方法(转帖以及记录)
    asyncio:异步I/O、事件循环和并发工具(持续跟新中)
    Enum的使用记录。
    mac下nginx的安装和配置,已经相关设置(转帖)。
    流畅的python,Fluent Python 第十七章笔记 (使用future处理并发)
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3174314.html
Copyright © 2020-2023  润新知