zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Uvaoj 11624 - Fire!

2023-09-14 08:57:55 时间

/*************************************************************************

 File Name: test.cpp

 Author: HJZ

 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时刻的新位置并重新进入队列!

#include queue 

#include string 

#include cstdio 

#include cstring 

#include iostream 

#include iomanip 

#include cmath 

#include algorithm 

#include queue 

#define M 1005

#define mem(a) (memset((a), 0, sizeof(a)))

#define get(s) fgets(s, sizeof(s)-1, stdin)

using namespace std;

char map[M][M];

int n, m;

int bg, ed;

int dir[4][2]={1, 0, 0, 1, -1, 0, 0, -1};

struct Point{

 int x, y, step;

 Point(){

 Point(int x, int y, int step){

 this- 

 this- 

 this- step=step;

queue Point queue Point 

int cntF;//某一时刻,火点的位置进入队列的个数

int cntP;//某一时刻,joe可走位置进入队列的个数

int bfs(){

 while(!q.empty()) q.pop();

 q.push(Point(bg, ed, 1));

 while(1){

 while(!qf.empty() cntF){

 Point Fcur=qf.front();

 qf.pop();

 --cntF;

 int x=Fcur.x, y=Fcur.y;

 for(int i=0; i ++i){

 int xx=x+dir[i][0];

 int yy=y+dir[i][1];

 if(map[xx][yy]!=F map[xx][yy]!=#){

 map[xx][yy]=F;

 qf.push(Point(xx, yy, 0));

 cntF=qf.size();

 while(!q.empty() cntP){

 Point cur=q.front();

 q.pop(); --cntP; int x=cur.x, y=cur.y;

 if(x==1 || x==n || y==1 || y==m) return cur.step;

 for(int i=0; i ++i){

 int xx=x+dir[i][1];

 int yy=y+dir[i][0];

 if(map[xx][yy]!=# map[xx][yy]!=F map[xx][yy]!=X){

 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)); } } }

 cntP=q.size();

 if(cntP==0) return -1;

 return -1;

int main(){

 int t;

 scanf("%d", 

 while(t--){

 scanf("%d%d", n, 

 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();

 cntF=0;

 cntP=1;

 for(int j=0, i=1; i ++i){

 scanf("%s", map[i]+1);

 for(j=1; j ++j)

 if(map[i][j]==J){

 bg=i;

 ed=j;

 else if(map[i][j]==F){

 ++cntF;

 qf.push(Point(i, j, 0));

 map[i][j]=#;

 int tt=bfs();

 if(tt!=-1)

 printf("%d\n", tt);

 else printf("IMPOSSIBLE\n");

 return 0;

}

Fire!! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe escape the maze.