题目:Fire!
思路:
两次bfs。
第一次bfs预处理出火蔓延到每个格子的时间,每次只需要考虑上一次新被点燃的格子向外蔓延。复杂度O(rc)。
第二次bfs找Joe走出迷宫的最短路。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
int n,m;
struct Pair {
int x,y;
Pair(int xx=0,int yy=0) {
x=xx,y=yy;
}
bool operator < (const Pair& oth) const {
return x<oth.x||(x==oth.x&&y<oth.y);
}
bool Out(){
return x<0||x>=n||y<0||y>=m;
}
};
struct State{
Pair pst;
int stp;
State(Pair p,int s=0){
pst=p,stp=s;
}
};
const int m1[5]= {0,0,1,-1};
const int m2[5]= {1,-1,0,0};
bool g[maxn+5][maxn+5]; //地图,仅包含空地、障碍两种状态
Pair Joe; //Joe所在的初始位置
queue<Pair> Fire;
int tme[maxn+5][maxn+5]; //格子着火的时间
queue<State> q;
set<Pair> st; //判重
void init() {
memset(tme,-1,sizeof(tme));
queue<Pair> emp;
Fire=emp;
queue<State> emp2;
q=emp2;
st.clear();
}
char readin() {
char x;
while(~(x=getchar())&&!(isalpha(x)||x=='.'||x=='#'));
return x;
}
void make_fire() { //计算每个格子的着火时间
while(!Fire.empty()) {
vector<Pair> h;
while(!Fire.empty()) {
h.push_back(Fire.front());
Fire.pop();
}
for(int i=0; i<h.size(); i++) {
for(int j=0; j<4; j++) {
int x=h[i].x+m1[j],y=h[i].y+m2[j];
if(!g[x][y]&&tme[x][y]==-1&&!Pair(x,y).Out()) {
tme[x][y]=tme[h[i].x][h[i].y]+1;
Fire.push(Pair(x,y));
}
}
}
}
}
int bfs(){ //计算Joe逃出所用的最短时间
st.insert(Joe);
q.push(State(Joe,0));
while(!q.empty()){
State h=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=h.pst.x+m1[i],y=h.pst.y+m2[i];
int stp=h.stp+1;
if(Pair(x,y).Out()) return stp;
if((tme[x][y]==-1||tme[x][y]>stp)&&!g[x][y]&&st.find(Pair(x,y))==st.end()){
st.insert(Pair(x,y));
q.push(State(Pair(x,y),stp));
}
}
}
return -1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
init();
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
char x=readin();
if(x=='#') g[i][j]=1;
else g[i][j]=0;
if(x=='J') Joe=Pair(i,j);
if(x=='F') {
Fire.push(Pair(i,j));
tme[i][j]=0;
}
}
}
make_fire();
int ans=bfs();
if(ans==-1) printf("IMPOSSIBLE\n");
else printf("%d\n",ans);
}
return 0;
}
本文介绍了一种使用两次广度优先搜索(BFS)解决迷宫中人物逃脱问题的方法。首先通过BFS预处理火势蔓延的时间,然后再次使用BFS找到人物逃离迷宫的最短路径。文章详细阐述了算法实现过程,并提供了完整的C++代码。
438

被折叠的 条评论
为什么被折叠?



