【题目链接】

            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.\n");
}

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\n",++TC);
                bfs1();
                printf("\n");
        }
        
        return 0;
    
}