首页 > 代码库 > UVA11624_Fire!
UVA11624_Fire!
在一个矩形方阵里面,一个人要从一个位置走向另一个位置,其中某些地方有火源,每过一分钟,火源就会点燃相邻的点,同时相邻的点也变成了火源。人不能通过有火的点。问一个人能够安全地走到目的地去?最短时间多少?
氺题不多说,直接预处理每个点的起火时间,然后bfs即可。
召唤代码君:
#include <iostream>#include <cstring>#include <cstdio>#include <queue>#define maxn 1010using namespace std;char s[maxn][maxn];int g[maxn][maxn];int T,n,m;int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};bool inside(int cx,int cy){ return cx>0 && cx<=n && cy>0 && cy<=m;}bool border(int cx,int cy){ return cx==1 || cx==n || cy==1 || cy==m;}void init_fire(){ for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) g[i][j]=99999999; queue<int> qx,qy; for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (s[i][j]==‘F‘) qx.push(i),qy.push(j),g[i][j]=0; while (!qx.empty()) { int cx=qx.front(),cy=qy.front(); qx.pop(),qy.pop(); for (int i=0; i<4; i++) { if (!inside(cx+dx[i],cy+dy[i])) continue; if (s[cx+dx[i]][cy+dy[i]]!=‘.‘) continue; if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue; g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1; qx.push(cx+dx[i]),qy.push(cy+dy[i]); } }}int bfs(){ queue<int> qx,qy; for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (s[i][j]==‘J‘) { g[i][j]=0; qx.push(i),qy.push(j); if (border(i,j)) return 1; } while (!qx.empty()) { int cx=qx.front(),cy=qy.front(); qx.pop(),qy.pop(); for (int i=0; i<4; i++) { if (s[cx+dx[i]][cy+dy[i]]!=‘.‘) continue; if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue; if (border(cx+dx[i],cy+dy[i])) return g[cx][cy]+2; g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1; qx.push(cx+dx[i]),qy.push(cy+dy[i]); } } return -1;}int main(){ scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) scanf("%s",s[i]+1); init_fire(); int ans=bfs(); if (ans==-1) puts("IMPOSSIBLE"); else printf("%d\n",ans); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。