uva11624
2015-07-25 11:01
267 查看
题目名称:Fire!
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671
题意:joe在一个迷宫里,有地方着火,火的蔓延方向是上下左右,每次一格,joe可以走的方向也是上下左右,每次一格,问joe能否走出这个迷宫,可以输出最短的走出时间,‘ # ‘ 表示墙,’ F ‘ 表示火,’ . ' 表示可走
思路:bfs,不过有点麻烦,,然后还有点坑,也许是他的内部输入数据有些后面多了个空格什么的,,用getchar(),一直wa,调试了一天,以为是主程序哪里错了==,,,还要注意得先把火扔进队列
代码如下:
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671
题意:joe在一个迷宫里,有地方着火,火的蔓延方向是上下左右,每次一格,joe可以走的方向也是上下左右,每次一格,问joe能否走出这个迷宫,可以输出最短的走出时间,‘ # ‘ 表示墙,’ F ‘ 表示火,’ . ' 表示可走
思路:bfs,不过有点麻烦,,然后还有点坑,也许是他的内部输入数据有些后面多了个空格什么的,,用getchar(),一直wa,调试了一天,以为是主程序哪里错了==,,,还要注意得先把火扔进队列
代码如下:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<queue> using namespace std; char a[1005][1005]; int Jx,Jy; bool vis[1005][1005]; //记录是否走过 int dir[4][2]={1,0,-1,0,0,1,0,-1}; int ok; //记录最短步数 int R,C; struct Node { int x,y; int sum; bool fire; //判断是否为火 }que[1001*1001]; int bfs() { int frot=0,rear=0; memset(vis,false,sizeof(vis)); for(int i=0;i<R;i++) for(int j=0;j<C;j++) if(a[i][j]=='F') //火的数目可能有多个 { que[rear].x=i; que[rear].y=j; que[rear].sum=0; que[rear].fire=true; rear++; } que[rear].x=Jx; que[rear].y=Jy; que[rear].sum=0; que[rear].fire=false; rear++; while(frot<rear) { int xx=que[frot].x; int yy=que[frot].y; for(int i=0;i<4;i++) { int xx=que[frot].x+dir[i][0]; int yy=que[frot].y+dir[i][1]; if(que[frot].fire) //火 { if(xx<0||yy>=C||yy<0||xx>=R||a[xx][yy]=='#'||a[xx][yy]=='F') continue; a[xx][yy]='F'; que[rear].x=xx; que[rear].y=yy; que[rear].sum=que[frot].sum+1; que[rear].fire=true; rear++; } else //人 { if(vis[xx][yy]||a[xx][yy]=='#'||a[xx][yy]=='F') continue; if(xx<0||yy<0||xx>=R||yy>=C) return que[frot].sum+1; vis[xx][yy]=true; que[rear].x=xx; que[rear].y=yy; que[rear].sum=que[frot].sum+1; que[rear].fire=false; rear++; } } frot++; } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&R,&C); memset(vis,0,sizeof(vis)); Jx=Jy=-1; for(int i=0; i<R; i++) { scanf("%s", a[i]); if(Jx == -1) for(int j=0; j<C; j++) if(a[i][j] == 'J') { Jx = i; Jy = j; break; } } /* getchar(); //就是这样写,,一直wa for(int i=0; i<R; i++) { for(int j=0; j<C; j++) { scanf("%c", &a[i][j]); if(a[i][j] == 'J') { Jx = i; Jy = j; } } getchar(); } */ ok=bfs(); if(ok) printf("%d\n",ok); else printf("IMPOSSIBLE\n"); } return 0; }
相关文章推荐
- JQuery基础attribute
- 旋转数组
- BZOJ 1068 [SCOI2007]压缩 区间DP
- 数据库之总2
- HDU 1016 Prime Ring Problem
- 微软Win10 Build 10240推送更新补丁修正版KB3074680
- hadoop Hdfs文件上传下载
- C语言(3)--Fibonacci数列、候选人得票统计、字符串复制函数
- 数据库之总1
- 数据库之横表转纵表、纵表转横表
- 有序数组和二分法
- unbutu下安装与配置phpmyadmin
- 04-树9. Path in a Heap (25)
- UVa 11078 - Open Credit System(维护最大值)
- [Leetcode 150, Medium] Evaluate Reverse Polish Notation
- SQLserver数据库中带循环处理的存储过程
- OC_交叉引入头文件问题
- html 代码初识——<a>标签
- .net学习之委托
- .net学习之messagebox的各种枚举