UVA 11264 Fire!
2015-06-09 21:25
267 查看
第一次bfs把火到各点燃烧的最短时间计算出并存储
第二次bfsXX如果走到该点的时间大于等于火烧到这点所用的时间 那么不入队(XX必然被烧死
不过第一次写只用了一次bfs 把火和人同时入队 难道是造成混乱? 反正无限WA
坑点是一开始人就站在了边界处 输出1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int ftime[1005][1005];
int vis[1005][1005];
char Map[1005][1005];
int R,C;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node{
int x,y;
int step;
};
queue<node> que;
int st_x,st_y;
void bfs1()
{
memset(ftime,INF,sizeof(ftime));
node st,en;
while(!que.empty()){
st=que.front();
que.pop();
for(int i=0;i<4;i++){
en.x=st.x+dir[i][0];
en.y=st.y+dir[i][1];
en.step=st.step+1;
if(en.x<0||en.x>=R||en.y<0||en.y>=C||Map[en.x][en.y]=='#')
continue;
if(en.step<ftime[en.x][en.y]){
ftime[en.x][en.y]=en.step;
que.push(en);
}
}
}
}
int bfs2()
{
while(!que.empty())que.pop();
memset(vis,0,sizeof(vis));
node st,en;
st.x=st_x;
st.y=st_y;
st.step=0;
que.push(st);
while(!que.empty()){
st=que.front();
que.pop();
for(int i=0;i<4;i++){
en.x=st.x+dir[i][0];
en.y=st.y+dir[i][1];
en.step=st.step+1;
if(en.step>=ftime[en.x][en.y]||Map[en.x][en.y]=='#'||vis[en.x][en.y]==1)
continue;
if(en.x==0||en.x==R-1||en.y==0||en.y==C-1){
printf("%d\n",en.step+1);
return 1;
}
vis[en.x][en.y]=1;
que.push(en);
}
}
return 0;
}
int main()
{
int cases;
//freopen("in.txt","r",stdin);
scanf("%d",&cases);
while(cases--){
while(!que.empty())
que.pop();
scanf("%d%d",&R,&C);
getchar();
node nd;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
scanf("%c",&Map[i][j]);
if(Map[i][j]=='F'){
nd.x=i;
nd.y=j;
nd.step=0;
ftime[i][j]=0;
que.push(nd);
}
else if(Map[i][j]=='J'){
st_x=i;
st_y=j;
}
}
getchar();
}
if(st_x==0||st_x==R-1||st_y==0||st_y==C-1){
printf("1\n");
continue;
}
bfs1();
if(!bfs2())
printf("IMPOSSIBLE\n");
}
return 0;
}
第二次bfsXX如果走到该点的时间大于等于火烧到这点所用的时间 那么不入队(XX必然被烧死
不过第一次写只用了一次bfs 把火和人同时入队 难道是造成混乱? 反正无限WA
坑点是一开始人就站在了边界处 输出1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int ftime[1005][1005];
int vis[1005][1005];
char Map[1005][1005];
int R,C;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node{
int x,y;
int step;
};
queue<node> que;
int st_x,st_y;
void bfs1()
{
memset(ftime,INF,sizeof(ftime));
node st,en;
while(!que.empty()){
st=que.front();
que.pop();
for(int i=0;i<4;i++){
en.x=st.x+dir[i][0];
en.y=st.y+dir[i][1];
en.step=st.step+1;
if(en.x<0||en.x>=R||en.y<0||en.y>=C||Map[en.x][en.y]=='#')
continue;
if(en.step<ftime[en.x][en.y]){
ftime[en.x][en.y]=en.step;
que.push(en);
}
}
}
}
int bfs2()
{
while(!que.empty())que.pop();
memset(vis,0,sizeof(vis));
node st,en;
st.x=st_x;
st.y=st_y;
st.step=0;
que.push(st);
while(!que.empty()){
st=que.front();
que.pop();
for(int i=0;i<4;i++){
en.x=st.x+dir[i][0];
en.y=st.y+dir[i][1];
en.step=st.step+1;
if(en.step>=ftime[en.x][en.y]||Map[en.x][en.y]=='#'||vis[en.x][en.y]==1)
continue;
if(en.x==0||en.x==R-1||en.y==0||en.y==C-1){
printf("%d\n",en.step+1);
return 1;
}
vis[en.x][en.y]=1;
que.push(en);
}
}
return 0;
}
int main()
{
int cases;
//freopen("in.txt","r",stdin);
scanf("%d",&cases);
while(cases--){
while(!que.empty())
que.pop();
scanf("%d%d",&R,&C);
getchar();
node nd;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
scanf("%c",&Map[i][j]);
if(Map[i][j]=='F'){
nd.x=i;
nd.y=j;
nd.step=0;
ftime[i][j]=0;
que.push(nd);
}
else if(Map[i][j]=='J'){
st_x=i;
st_y=j;
}
}
getchar();
}
if(st_x==0||st_x==R-1||st_y==0||st_y==C-1){
printf("1\n");
continue;
}
bfs1();
if(!bfs2())
printf("IMPOSSIBLE\n");
}
return 0;
}
相关文章推荐
- 如何评价 IBM 收购 Blue Box 集团
- IGBT散热分析
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
- Android学习系列--App调试内存泄露之Context篇
- CleanCode笔记---有意义的命名
- Linux通配符摘要
- IDL视频教程
- DZ3.2手机端访问bug彻底解决方法:您访问的页面无手机页面,是否进一步访问电脑版
- cocos2d-x 3.6版连连看
- codeevs 1069关押罪犯,关系并查集
- 初级算法整理,选择排序法
- 黑客帝国屏保源码
- RT-thread-2.0.1移植(基于STM32F4xx)
- 图片轮播,纯js+css
- MFC计算绩点小程序
- C# Assembly
- 赋值运算符
- opencv的cvCvtColor问题
- 小言C指针
- Android 5.1截获HOME键