Fire(广搜里写广搜)
来源:互联网 发布:javascript if 编辑:程序博客网 时间:2024/06/07 07:35
题目来源:https://vjudge.net/contest/159739#problem/J
【题意】
n*m的矩阵里,多个’F’同时着火,’J’要逃到矩阵外,问若可行,需要多长时间,或者输出不可行。
【思路】
只需要广搜一下人的位置,再结合火的广搜位置,求出是否可行。
【代码】
#include<map>#include<stack>#include<queue>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<string>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long LL;char area[1010][1010];int d[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};int n,m,stx,sty;struct pp{ int x,y,t;} q1,q2,q3,q4;bool check(int x,int y)//判定人是否可走{ if(x<0||x>=n||y<0||y>=m||area[x][y]=='F'||area[x][y]=='#'||area[x][y]=='J') return 0; return 1;}bool judge(int x,int y)//判定火是否可走{ if(x<0||x>=n||y<0||y>=m||area[x][y]=='#'||area[x][y]=='F') return 0; return 1;}void bfs(){ queue<pp> q,que; for(int i=0; i<n; i++) { scanf("%s",area[i]); for(int j=0; j<m; j++) { if(area[i][j]=='J') { q1.x=i,q1.y=j,q1.t=0; q.push(q1); } else if(area[i][j]=='F') { q1.x=i,q1.y=j,q1.t=0; que.push(q1); } } } int tt=0,flag=0; while(!q.empty())//人的队列 { q1=q.front(); q.pop(); if(q1.t!=tt)//保证同时性 { if(flag) flag=0; else { printf("IMPOSSIBLE\n"); return; } while(!que.empty())//火的队列 { q3=que.front(); if(q3.t!=tt)//保证同时性 { tt=q3.t; break; } que.pop(); for(int i=0; i<4; i++) { q4.x=q3.x+d[i][0]; q4.y=q3.y+d[i][1]; if(judge(q4.x,q4.y)) { area[q4.x][q4.y]='F'; q4.t=q3.t+1; que.push(q4); } } } } if(area[q1.x][q1.y]=='F')//即使人可走,但是已经被火烧过,所以continue continue; if(q1.x==0||q1.y==0||q1.x==n-1||q1.y==m-1)//是否到达边界 { printf("%d\n",q1.t+1); return ; } flag=1; for(int i=0; i<4; i++) { q2.x=q1.x+d[i][0]; q2.y=q1.y+d[i][1]; if(check(q2.x,q2.y)) { area[q2.x][q2.y]='J'; q2.t=q1.t+1; q.push(q2); } } } printf("IMPOSSIBLE\n");//当人的队列为空,此时flag同样为0,应该输出IMPOSSIBLE。}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%*c",&n,&m); mem(area,0x00); bfs(); }}
0 0
- Fire(广搜里写广搜)
- Fire Game(BFS)
- zoj1002(Fire Net)
- Fire Game (BFS)
- 树形dp(Fire)
- Fire Net(DFS)
- Fire!(bfs) UVA
- UVa11624-Fire!(bfs)
- Fire!(UVA-11624)
- Fire! (多点移动)
- Fire Net (DFS)
- Fire!
- Fire!
- Fire!
- Fire!
- Fire
- Fire!
- Fire!
- codeforces788A Functions again
- JavaScript---对象学习(二)Array对象、Date对象及其重要函数学习
- VMware+ubuntu
- Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
- 将博客搬至CSDN
- Fire(广搜里写广搜)
- Software Company LightOJ
- Zookeeper安装
- 漫步数理统计二十四——伽玛、卡方与贝塔分布
- 【Review】A Review on Deep Learning Techniques Applied to Semantic Segmentation
- TabHost、RadioGroup、ToolBar实现底部菜单导航
- codeforces788B Weird journey
- 区域生长算法原理以及Matlab实现
- hdu 1008 Elevator