Time Limit: 2000MS | Memory Limit: 131072K | |||
Total Submissions: 3975 | Accepted: 1403 | Special Judge |
Description
Input
Output
Sample Input
1 7 SB....T 1 7 SB..#.T 7 11 ########### #T##......# #.#.#..#### #....B....# #.######..# #.....S...# ########### 8 4 .... .##. .#.. .#.. .#.B .##S .... ###T 0 0
Sample Output
Maze #1 EEEEE Maze #2 Impossible. Maze #3 eennwwWWWWeeeeeesswwwwwwwnNN Maze #4 swwwnnnnnneeesssSSS
题意:就不说了 大家小时候都玩过
思路:bfs嵌套 先对箱子bfs 再对人bfs 具体就不说了 这几天任务比较重
感想:poj上这题不报PE 只报WA WA的朋友试试 注意最后得加换行 我就被他坑了 ╮(╯▽╰)╭
ps:这题必须要用三维数组判重 不然有些数据是过不了的 具体见我贴的一组数据 不过在poj上是可以AC的 因为poj数据太水……
代码:
#include
#include
#include
#include
#include
#include
#define maxn 25
using namespace std;
int n,m;
int bsx,bsy,ssx,ssy,tex,tey;
int stsx,stsy,esx,esy;
int mp[maxn][maxn];
int boxvis[maxn][maxn][4]; // 箱子要采用3维数组存状态 第三维-得到箱子此时的状态的方向
int peovis[maxn][maxn];
int dx[4]={-1,1,0,0}; // up down left right
int dy[4]={0,0,-1,1};
char dir1[]="nswe";
char dir2[]="NSWE";
char s[maxn];
string ans,zans;
struct Tnode
{
int bx,by;
int sx,sy;
int cnt;
string path;
}cur,now;
struct Node
{
int zx,zy;
string zpath;
}zcur,znow;
queue q;
queue q1;
bool sbfs() // 对人bfs
{
int i,j;
int xx,yy,nxx,nyy;
string temps1,temps2;
while(!q1.empty()) q1.pop();
memset(peovis,0,sizeof(peovis));
zcur.zx=stsx;
zcur.zy=stsy;
zcur.zpath="";
q1.push(zcur);
peovis[stsx][stsy]=1;
while(!q1.empty())
{
znow=q1.front();
xx=znow.zx;
yy=znow.zy;
temps1=znow.zpath;
if(xx==esx&&yy==esy)
{
zans=temps1;
return true;
}
for(i=0;i<4;i++)
{
nxx=xx+dx[i];
nyy=yy+dy[i];
if(!mp[nxx][nyy]&&!peovis[nxx][nyy])
{
peovis[nxx][nyy]=1;
zcur.zx=nxx;
zcur.zy=nyy;
temps2=temps1+dir1[i];
zcur.zpath=temps2;
q1.push(zcur);
}
}
q1.pop();
}
return false;
}
bool isok(int u,int v,int ii)
{
if(mp[u][v]||boxvis[u][v][ii]) return false;
if(sbfs()) return true;
return false;
}
bool boxbfs() // 对箱子bfs
{
int i,j,x,y,x1,y1,nx,ny,nx1,ny1;
string bs1,bs2,ps;
while(!q.empty()) q.pop();
memset(boxvis,0,sizeof(boxvis));
cur.bx=bsx;
cur.by=bsy;
cur.sx=ssx;
cur.sy=ssy;
cur.path="";
q.push(cur);
while(!q.empty())
{
now=q.front();
x=now.bx;
y=now.by;
x1=now.sx;
y1=now.sy;
ps=now.path;
// printf("x:%d y:%d x1:%d y1:%d\n",x,y,x1,y1);
// cout<