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 JMS轻松实现异步消息传递
异步进程通信是面向服务架构(SOA)一个重要的组成部分,因为企业里很多系统通信,特别是与外部组织间的通信,实质上都是异步的.Java消息服务(JMS)是用于编写使用异步消息传递的JEE应用程序的API ...
- GetHub上很实用的几个Demo
手机号匹配的正则表达式:https://github.com/VincentSit/ChinaMobilePhoneNumberRegex/blob/master/README-CN.md FEBS- ...
- 基于LAMP实现后台活动发布和前端扫码签到系统
目的 无论是公司.学校和社会团体,都会举办各式各样的活动,比如运动会.部门会议.项目会议.野炊.团建等.作为团队管理者来讲,当然希望能够把这类活动转移到线上形成完整的系统,类似于电子流的形式.本文以学 ...
- android侧滑效果(引用官方网站提供的API文件)
原文地址:http://www.cnblogs.com/android100/p/android-SlidingMenu.html 在新浪微博和唱吧里面都有看到android的侧滑效果,于是想要学习一 ...
- Linux基础命令、软件安装
常用命令 查看当前系统中存在哪些shell cat /etc/shells [root@** ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /us ...
- 018、MySQL取满足日期在两个日期之间的所有数据
#查询 SELECT GZJK_CREATEDATE FROM abc_table WHERE ( ( GZJK_CREATEDATE >= UNIX_TIMESTAMP( '2019-08-0 ...
- Vuex源码分析(转)
当我们用vue在开发的过程中,经常会遇到以下问题 多个vue组件共享状态 Vue组件间的通讯 在项目不复杂的时候,我们会利用全局事件bus的方式解决,但随着复杂度的提升,用这种方式将会使得代码难以维护 ...
- face_recognition实时人脸识别
具体安装移步:https://www.cnblogs.com/ckAng/p/10981025.html 更多操作移步:https://github.com/ageitgey/face_recogni ...
- 逆战:微信小程序
微信小程序的生命周期 onLaunch: function(options) { // ...
- .nerCore-RabbitMQDemo消息队列
1.定义:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.MQ是消费- ...