zoukankan      html  css  js  c++  java
  • 【POJ 1475】 Pushing Boxes

    【题目链接】

                http://poj.org/problem?id=1475

    【算法】

              双重BFS

    【代码】

               

    #include <algorithm>
    #include <bitset>
    #include <cctype>
    #include <cerrno>
    #include <clocale>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <limits>
    #include <list>
    #include <map>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <utility>
    #include <vector>
    #include <cwchar>
    #include <cwctype>
    #include <stack>
    #include <limits.h>
    using namespace std;
    #define MAXN 30
    
    int n,m,i,j,px,py,bx,by,ex,ey,TC;
    string t;
    char mp[MAXN][MAXN];
    bool visited1[MAXN][MAXN],visited2[MAXN][MAXN];
    
    const int dx[4] = {0,0,-1,1};
    const int dy[4] = {-1,1,0,0};
    const char box_path[5] = "WENS";
    const char people_path[5] = "wens";
    
    struct Box
    {
            int bx,by,px,py;
            string path;
    };
    struct People
    {
            int x,y;
            string path;
    };
    inline bool ok(int x,int y)
    {
            return x >= 1 && x <= n && y >= 1 && y <= m;
    }
    inline bool bfs2(int sx,int sy,int ex,int ey,int nx,int ny)
    {
            int i,tx,ty;
            People cur;
            queue< People > q;
            while (!q.empty()) q.pop();
            memset(visited2,false,sizeof(visited2));
            q.push((People){sx,sy,""});
            while (!q.empty())
            {
                    cur = q.front();
                    q.pop();
                    if (cur.x == ex && cur.y == ey)
                    {
                            t = cur.path;
                            return true;
                    } 
                    for (i = 0; i < 4; i++)
                    {
                            tx = cur.x + dx[i];
                            ty = cur.y + dy[i];
                            if (ok(tx,ty) && !visited2[tx][ty] && mp[tx][ty] != '#')
                            {
                                    if (tx == nx && ty == ny) continue;
                                    visited2[tx][ty] = true;
                                    q.push((People){tx,ty,cur.path+people_path[i]});
                            }
                    }
            }    
            return false;    
    }
    inline void bfs1()
    {
            int i,tx,ty;
            queue<Box> q;
            Box cur;
            memset(visited1,false,sizeof(visited1));
            while (!q.empty()) q.pop();
            q.push((Box){bx,by,px,py,""});
            while (!q.empty())
            {    
                    cur = q.front();
                    q.pop();
                    if (cur.bx == ex && cur.by == ey)
                    {
                            cout<< cur.path << endl;
                            return;
                    }
                    for (i = 0; i < 4; i++)
                    {
                            tx = cur.bx + dx[i];
                            ty = cur.by + dy[i];
                            if (ok(tx,ty) && !visited1[tx][ty] && mp[tx][ty] != '#')
                            {
                                    if (bfs2(cur.px,cur.py,cur.bx-dx[i],cur.by-dy[i],cur.bx,cur.by))        
                                    {
                                            visited1[tx][ty] = true;
                                            q.push((Box){tx,ty,cur.bx,cur.by,cur.path+t+box_path[i]});
                                    } 
                            } 
                    }
            }
            printf("Impossible.
    ");
    }
    
    int main() 
    {
            
            while (scanf("%d%d",&n,&m) != EOF && n && m)
            {
                    getchar();
                    for (i = 1; i <= n; i++)
                    {
                            for (j = 1; j <= m; j++)
                            {
                                    mp[i][j] = getchar();
                                    if (mp[i][j] == 'S')
                                    {
                                            px = i;
                                            py = j;
                                    }
                                    if (mp[i][j] == 'B')
                                    {
                                            bx = i;
                                            by = j;
                                    }
                                    if (mp[i][j] == 'T')
                                    {
                                            ex = i;
                                            ey = j;
                                    }
                            }
                            getchar();
                    }
                    printf("Maze #%d
    ",++TC);
                    bfs1();
                    printf("
    ");
            }
            
            return 0;
        
    }
  • 相关阅读:
    python-通过psutil监控系统性能
    集合类和JAVA多线程
    JAVA异常和基础类库
    类设计基础与进阶
    面对对象思想
    AtCoder Beginner Contest 185
    Java概述
    友链
    牛客编程巅峰赛S2第7场
    牛客小白月赛30
  • 原文地址:https://www.cnblogs.com/evenbao/p/9267684.html
Copyright © 2011-2022 走看看