Escape
题目
Edward去寻宝归来迷路了,然而他没有技能,而且什么装备都没有!!!所以他既不能穿墙,也不敢接触到怪兽。重要的是怪兽都会分身,每分钟会上、下、左、右四个方向同时分裂,怪兽分身时候也不能穿墙,但是Edward只能每分钟只能移动一格。幸运的是只要Edward走出边界就可以向人们求助了。也就是说,只要到达边界后可以顺利的向外多走一格,Edward就能成功脱险了。而且当Edward走了一格后怪物才分身。
输入描述
Input
第一行输入包含一个整数,即测试次数
每个测试用例的第一行包含两个整数R, C(1 ≤ R, C ≤ 1000),用空格分隔。
下面R行中,每一行都包含C个字符,以及每个字符是以下之一:
“#” 代表墙
“.” 代表空地,怪兽和Edward是可通行的
“E” Edward在地图中最初的位置,怪兽和Edward是可通行的
“M” 代表怪兽
在每组测试中只有一个E
输出描述
Output
对于每个测试用例,如果在怪兽分身接触到了Edward,则Edward无法逃出迷宫,输出’IMPOSSIBLE’,如果Edward能逃出迷宫,则输出Edward最快可以在几分钟内安全逃出迷宫,每组输出占一行。
样本输入
Input example
2
4 4 #### #EM# #…# #…# 3 3 ### #E. #.M
样本输出
Output example
3
IMPOSSIBLE
解答
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
#include<math.h>
using namespace std;
typedef struct{
int x;
int y;
}NODE;
typedef vector<NODE> LIST;
typedef queue<NODE> QUE;
NODE start;
LIST theMlist;
LIST endlist;
QUE que;
int map[1001][1001];
int n,m;
void bfs(QUE &que){
NODE next;
int x,y;
while(!que.empty()){
x=que.front().x;
y=que.front().y;
if(x>=2&&fabs(map[x-1][y])>fabs(map[x][y])+1)
{ map[x-1][y]=(map[x][y]>0?map[x][y]+1:map[x][y]-1); next.x=x-1; next.y=y; que.push(next);}
if(x+1<=n&&fabs(map[x+1][y])>fabs(map[x][y])+1)
{ map[x+1][y]=(map[x][y]>0?map[x][y]+1:map[x][y]-1); next.x=x+1; next.y=y; que.push(next);}
if(y>=2&&fabs(map[x][y-1])>fabs(map[x][y])+1)
{ map[x][y-1]=(map[x][y]>0?map[x][y]+1:map[x][y]-1); next.x=x; next.y=y-1; que.push(next);}
if(y+1<=m&&fabs(map[x][y+1])>fabs(map[x][y])+1)
{ map[x][y+1]=(map[x][y]>0?map[x][y]+1:map[x][y]-1); next.x=x; next.y=y+1; que.push(next);}
que.pop();
}
}
int main(){
LIST::iterator p;
int i,answer;
scanf("%d",&i);
while(i--){
while(!que.empty()) que.pop();
answer=-1;
theMlist.clear();
endlist.clear();
memset(map,'0',sizeof(map));
scanf("%d %d",&n,&m);
getchar();
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
map[x][y]=getchar();
if(map[x][y]=='#') map[x][y]=0;
else if(map[x][y]=='.'){
if(x==1||x==n||y==1||y==m){
NODE end;
end.x=x;
end.y=y;
endlist.push_back(end);
}
map[x][y]=1000000;
}
else if(map[x][y]=='M'){
NODE M;
M.x=x;
M.y=y;
theMlist.push_back(M);
map[x][y]=0;
}
else if(map[x][y]=='E'){
if(x==1||x==n||y==1||y==m){
NODE end;
end.x=x;
end.y=y;
endlist.push_back(end);
}
start.x=x;
start.y=y;
map[x][y]=1;
}
}
getchar();
}
que.push(start);
bfs(que);
for(p=theMlist.begin();p!=theMlist.end();p++){
que.push(*p);
bfs(que);
}
for(p=endlist.begin();p!=endlist.end();p++){
if(map[(*p).x][(*p).y]>0&&(map[(*p).x][(*p).y]<answer||answer==-1)) answer=map[(*p).x][(*p).y];
}
if(answer==-1||answer==1000000) printf("IMPOSSIBLE\n");
else printf("%d\n",answer);
}
return 0;
}