UVA 11624 Fire! ([kuangbin带你飞]专题一 简单搜索)

来源:互联网 发布:晋路软件 编辑:程序博客网 时间:2024/06/05 19:14

题目:题目

大意:在迷宫中,人J逃出去,,,出区域就算,迷宫中还有火,火会像四周蔓延,人不能走火易经到达的位置,求最短多长时间能出来

解体思路:用两次bfs,第一次记录火到每个地点的时间,第二次求人道每个地方的时间,但是要求,人到的哪个位置的时间i火要早


#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<iostream>using namespace std;int n,m;const int maxn = 1000+10;string mp[maxn];struct Node{int x;int y;int t;Node(){};Node(int xx,int yy,int tt):x(xx),y(yy),t(tt){};}start;bool vis[maxn][maxn];int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int ts[maxn][maxn];queue<Node> q;const int inf = 0x3f3f3f3f;bool ok(int x,int y){if(x >= 0 && x < n && y >= 0 && y < m) return true;return false;}void init(){bool isfire = false;while(!q.empty()) q.pop();memset(ts,inf,sizeof(ts));这里把火的位置初始化最大值,开始都是0WA了, memset(vis,false,sizeof(vis));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(mp[i][j]=='J'){//记录人的坐标 start.x=i;start.y=j;start.t=0;}if(mp[i][j]=='F'){//记录火的其实坐标放进队列中 isfire=true;vis[i][j]=true;ts[i][j]=0;q.push(Node(i,j,0));}}}if(!isfire)return ;while(!q.empty()){//求火的位置并进行记录 Node temp = q.front();q.pop();for(int i=0;i<4;i++){int dx=temp.x+dir[i][0];int dy=temp.y+dir[i][1];if(ok(dx,dy) && !vis[dx][dy] && mp[dx][dy]=='.'){vis[dx][dy]=true;ts[dx][dy]=temp.t+1;q.push(Node(dx,dy,temp.t+1));} }}}int bfs(){while(!q.empty()) q.pop();q.push(start);memset(vis,false,sizeof(vis));vis[start.x][start.y]=true;while(!q.empty())//求人的位置 {Node temp = q.front();q.pop();for(int i=0;i<4;i++){int dx=temp.x+dir[i][0];int dy=temp.y+dir[i][1];if(!ok(dx,dy)) return temp.t+1;if(!vis[dx][dy] && mp[dx][dy]=='.' && temp.t+1<ts[dx][dy]){q.push(Node(dx,dy,temp.t+1));vis[dx][dy]=true;}}}return inf;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){cin>>mp[i];}init();int ans=bfs();if(ans!=inf){printf("%d\n",ans);}else{printf("IMPOSSIBLE\n");}}return 0;}


0 0
原创粉丝点击