UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M);
UVA 11624 写的比较挫
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- struct node{
- int ft;
- int sta;
- }flo[][];
- int vis[][];
- struct person{
- int x,y,t,fx,fy;
- };
- int R,C;
- int dir[][]={{,},{,-},{,},{-,}};
- typedef pair<int,int> pill;
- queue<pill> v;
- queue<person> q;
- void init()
- {
- memset(vis,,sizeof vis);
- while (!v.empty()){
- pill x=v.front();
- v.pop();
- for (int i=;i<;i++){
- int nx=x.first+dir[i][];
- int ny=x.second+dir[i][];
- int tmp=flo[x.first][x.second].ft+;;
- if (nx< || ny< || nx>=R || ny>=C) continue;
- if (flo[nx][ny].ft>= && flo[nx][ny].ft<=tmp || flo[nx][ny].sta==) continue;
- flo[nx][ny].ft=flo[x.first][x.second].ft+;
- pill b=make_pair(nx,ny);
- if (!vis[nx][ny])
- v.push(b);
- vis[nx][ny]=;
- }
- }
- }
- int bfs(person x)
- {
- memset(vis,,sizeof vis);
- while (!q.empty()) q.pop();
- q.push(x);
- int s=<<;
- while (!q.empty()){
- person u=q.front();
- q.pop();
- if (u.t>=s) continue;
- if (u.x== || u.y== || u.x==R- || u.y==C-) {s=u.t;break;}
- for (int i=;i<;i++){
- int xx=u.x+dir[i][];
- int yy=u.y+dir[i][];
- if (xx< || yy< || xx>=R || yy>=C) continue;
- if (xx==u.fx && yy==u.fy) continue;
- if (flo[xx][yy].sta!= || flo[xx][yy].ft>= && flo[xx][yy].ft<=u.t+) continue;
- person b=(person){xx,yy,u.t+,u.x,u.y};
- if (!vis[xx][yy]) q.push(b);
- vis[xx][yy]=;
- }
- }
- return s;
- }
- int main()
- {
- int t,sx,sy;char ch;
- scanf("%d",&t);
- while (t--){
- while (!v.empty()) v.pop();
- scanf("%d%d",&R,&C);
- getchar();
- for (int i=;i<R;i++){
- for (int j=;j<C;j++){
- scanf("%c",&ch);
- //cout<<ch<<endl;
- if (ch=='.') {flo[i][j].sta=;flo[i][j].ft=-;}
- else if (ch=='#'){flo[i][j].sta=;flo[i][j].ft=-;}
- else if (ch=='F'){
- flo[i][j].sta=flo[i][j].ft=;
- pill a;a.first=i;a.second=j;v.push(a);
- }
- else if (ch=='J') sx=i,sy=j;
- }
- getchar();
- }
- init();
- person a=(person){sx,sy,,-,-};
- int ans=bfs(a);
- if (ans<(<<)) printf("%d\n",ans+);
- else puts("IMPOSSIBLE");
- }
- return ;
- }
UVA 10047
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- int R,C;
- int vis[][][][];
- int mat[][];
- int sx,sy,ex,ey;
- int dir[][]={{-,},{,},{,},{,-}};
- struct t1{
- int x,y,d,c,t;
- };
- int bfs(t1 a)
- {
- queue<t1> q;
- q.push(a);
- memset(vis,,sizeof vis);
- while (!q.empty()){
- t1 u=q.front();
- q.pop();
- if (u.x==ex && u.y==ey && u.c==){
- //cout<<" pass "<<u.x<<" "<<u.y<<endl;
- return u.t;
- }
- vis[u.x][u.y][u.d][u.c]=;
- int nd=u.d+;
- if (nd>) nd=;
- t1 nx=u;
- nx.d=nd;
- nx.t=u.t+;
- if (!vis[nx.x][nx.y][nx.d][nx.c]) q.push(nx);
- vis[nx.x][nx.y][nx.d][nx.c]=;
- nd=u.d-;
- if (nd<) nd=;
- nx=u; nx.d=nd; nx.t=u.t+;
- if (!vis[nx.x][nx.y][nx.d][nx.c]) q.push(nx);
- vis[nx.x][nx.y][nx.d][nx.c]=;
- int xx=u.x+dir[u.d][];
- int yy=u.y+dir[u.d][];
- if (xx< || yy< || xx>=R || yy>=C) continue;
- if (mat[xx][yy]==) continue;
- int nc=u.c+;
- if (nc>) nc=;
- t1 b=(t1){xx,yy,u.d,nc,u.t+};
- if (!vis[b.x][b.y][b.d][b.c]) q.push(b);
- vis[b.x][b.y][b.d][b.c]=;
- }
- return -;
- }
- int main()
- {
- char ch;
- int kase=;
- while (scanf("%d%d",&R,&C)){
- if (R==) break;
- getchar();
- memset(mat,,sizeof mat);
- for (int i=;i<R;i++){
- for (int j=;j<C;j++){
- ch=getchar();
- if (ch!='#') mat[i][j]=;
- if (ch=='S') sx=i,sy=j;
- if (ch=='T') ex=i,ey=j;
- }
- getchar();
- }
- //cout<<ex<<" exy "<<ey<<endl;
- t1 a=(t1){sx,sy,,,};
- int ans=bfs(a);
- if (kase) puts("");
- printf("Case #%d\n",++kase);
- if (ans==-)puts("destination not reachable");
- else printf("minimum time = %d sec\n",ans);
- }
- return ;
- }
UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题的更多相关文章
- UVA 11624 Fire!(两次BFS+记录最小着火时间)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 11624 Fire!【两点BFS】
Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- Fire! UVA - 11624 (两步bfs)
题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVa 11624 (BFS) Fire!
也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...
随机推荐
- Spring任务调度实战之Quartz Cron Trigger
在Quartz中除了使用最简单的Simple Trigger以外,也可以使用类似Linux上Cron作业的CronTrigger的方式来运行Job,下面是一个小例子: 1. 首先是一个任务类,这个类没 ...
- leetcode844 Backspace String Compare
""" Given two strings S and T, return if they are equal when both are typed into empt ...
- docker-jenkins SSH Publishers时踩的坑
source相对路径问题,不是 /var/jenkins_home/workspace/build-renren/target/renren-fast.war 或环境变量,而是 target/re ...
- HDU1880 魔咒词典
题目大意:对应的输入多行,每行两个字符串,两个字符串互相映射.接下来询问的时候,如果这个字符串出现过,输出其对应的字符串. 分析:二重哈希来判断字符串是否存在,输出其对应的字符串就行.二重哈希的入门题 ...
- C++中数据类型表示范围
32位机器环境下结果如下: Type Size 数值范围 无值型void 0 byte 无值域 布尔型bool 1 byte true false 有符号短整型short [int] /signe ...
- Andorid 搭建 Linux服务器(一)
00.搭建环境 电脑系统:MacOS下Win7虚拟机 手机型号:红米Note5A 手机系统:MIUI10开发版 软件: SuperSU --通过recovery刷入,管理ROOT权限 Bus ...
- 困惑我的x++和++x;
刚学习C语言时X++和++X非常不解 目前有了新的领悟 1.X++ int x=0; int z=x++; 此时z?x? 这个问题可以分两步思考 第一步:先把x的值赋予z,此时z=x=0; 第二步:x ...
- 004、Java的多行注释
代码如下: package TIANPAN; public class TestDemo { public static void main(String args[]) { /* * 我是多行注释 ...
- 12 MySQL存储过程与函数
存储过程和函数 存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合. 调用存储过程和函数可以简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输,提高数据处理 ...
- LeetCode1217 玩筹码(贪心)
题目: 数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中. 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 ...