/*************************************************************************
> Mail: 2570230521@qq.com
> Created Time: 2014年08月03日 星期日 07时26分58秒
************************************************************************/
题目大意:一个人joe想从迷宫中逃脱,但是迷宫中有着火的地方!joe每分钟向上下左右其中一个方向走一步,当然有火的地方和有墙的地方是不能通过的!
另外,火的蔓延的方向是同一时刻向上下左右四个方向蔓延!
思路:每一时刻,先将火的蔓延位置标记出来,并将新的火的位置放入队列qf中;
因为某一时刻,我们将所有joe可能走的路径都放入了队列中了,假如t1时刻他能走的位置是5个,那么在t1+1时刻,根据上一时刻t1的可能位置更新t1+1
时刻的可能位置,t1时刻的位置出队列q, t1+1时刻的新位置并重新进入队列!
#define mem(a) (memset((a), 0, sizeof(a)))
#define get(s) fgets(s, sizeof(s)-1, stdin)
int dir[4][2]={1, 0, 0, 1, -1, 0, 0, -1};
Point(int x, int y, int step){
queue<Point>q; queue<Point>qf;
int cntF;//某一时刻,火点的位置进入队列的个数
int cntP;//某一时刻,joe可走位置进入队列的个数
while(!q.empty()) q.pop();
q.push(Point(bg, ed, 1));
while(!qf.empty() && cntF){
if(map[xx][yy]!='F' && map[xx][yy]!='#'){
qf.push(Point(xx, yy, 0));
while(!q.empty() && cntP){
q.pop(); --cntP; int x=cur.x, y=cur.y;
if(x==1 || x==n || y==1 || y==m) return cur.step;
if(map[xx][yy]!='#' && map[xx][yy]!='F' && map[xx][yy]!='X'){
if(x==1 || x==n || y==1 || y==m) return cur.step+1;
q.push(Point(xx, yy, cur.step+1)); } } }
for(int i=0; i<=n+1; ++i)
map[i][0]=map[i][m+1]='#';
for(int i=0; i<=m+1; ++i)
map[0][i]=map[n+1][i]='#';
while(!qf.empty()) qf.pop();
for(int j=0, i=1; i<=n; ++i){
else printf("IMPOSSIBLE\n");