2 条题解
-
0
是个好模板题 不难但是ex
#include<bits/stdc++.h> using namespace std; #define int long long /* n*m J是人的位置:.是路 #是墙 F是火(可能有多个) 火不断向四周蔓延 J逃跑到墙外就可以算成功了 问:j逃出去花费的最少时间 如果出不去返回IMPOSSIBLE 、 //okok 来看看本题:本题其实是一个模板:多源BFS记时 1:我们可以利用F 求出F【】【】 即火到各个地方的最短时间 2:对于人我们要求 a[][]即走到每部的时间 */ #define PII pair<int,int> const int N=1200; char g[N][N]; int a[N][N]; int f[N][N]; int n,m; int ans=1e9; int dx[]={1,-1,0,0}; int dy[]={0,0,-1,1}; bool check(int x,int y) { if(x<0||x>n-1||y<0||y>m-1) return 0; return 1; } void bfs() { queue<PII> q; for(int i=0;i<n;i++)//先初始化 放入所有单原 for(int j=0;j<m;j++) { if(g[i][j]=='F') { q.push({i,j}); f[i][j]=0; } } while(q.size()) { auto t=q.front(); q.pop(); int xx=t.first; int yy=t.second; for(int i=0;i<4;i++) { int nx=xx+dx[i]; int ny=yy+dy[i]; if(check(nx,ny)&&f[nx][ny]==0) { f[nx][ny]=f[xx][yy]+1; q.push({nx,ny}); } } } return; } void bfs2(int x,int y,int s[][N])//这俩代码相似复制修 { queue<PII> q; q.push({x,y}); a[x][y]=0; while(q.size()) { auto t=q.front(); q.pop(); int xx=t.first; int yy=t.second; //先判定终点 if(!check(xx,yy)) { ans=s[xx][yy]; break;//第一个出去的就行 } for(int i=0;i<4;i++) { int nx=xx+dx[i]; int ny=yy+dy[i]; if(s[nx][ny]==0 && (f[nx][ny]==0 || s[xx][yy]+1 < f[nx][ny])) //1:要看能不能走出去不要check 2走到下一步火还没来3不重复不撞墙 { s[nx][ny]=s[xx][yy]+1; q.push({nx,ny}); } } } return; } signed main() { std::ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; int x1,y1;//j的位置 for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>g[i][j]; if(g[i][j]=='#') a[i][j]=-1,f[i][j]=-1; if(g[i][j]=='J') x1=i,y1=j; } //1得到火焰数组 注意只要是火焰就先加入q bfs(); //ok再来看J bfs2(x1,y1,a); if(ans==1e9) cout<<"IMPOSSIBLE"<<"\n"; else cout<<ans<<"\n"; return 0; }
信息
- ID
- 524
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 163
- 已通过
- 35
- 上传者