Fire! UVA - 11624(bfs(多个起点))
时间:2019-08-19
本文章向大家介绍Fire! UVA - 11624(bfs(多个起点)),主要包括Fire! UVA - 11624(bfs(多个起点))使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://cn.vjudge.net/problem/UVA-11624
一开始以为只有一个F,WA的不知所措,看了评论说有多个F
思路:将所有F入队列,进行广搜,得到F到每个‘.’的最短时间。再将人J进行广搜,得到J到每个'.'的最时间。判断人到边缘上的'.'需要的时间是否小于F到该点的时间,然后找出最短时间。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 #include <stack> 6 #include <algorithm> 7 #include <cmath> 8 #include <map> 9 #define mem(a,b) memset(a,b,sizeof(a)); 10 using namespace std; 11 #define INF 0x3f3f3f3f 12 typedef long long ll; 13 int dir[4][2] = {0,1,0,-1,1,0,-1,0}; 14 const int maxn = 5000005; 15 int r,c,vis1[1005][1005],vis2[1005][1005]; 16 ll sum1[1005][1005],sum2[1005][1005]; 17 string s[1005]; 18 struct NNode{ 19 int x,y; 20 NNode(int x1,int y1):x(x1),y(y1){}; 21 }; 22 queue<NNode>Q; 23 struct Node{ 24 ll x,y,num; 25 Node(int x1,int y1,int n1):x(x1),y(y1),num(n1){}; 26 }; 27 void bfs1() { 28 queue<Node>q; 29 while(!Q.empty()){ 30 NNode T = Q.front(); 31 Q.pop(); 32 vis1[T.x][T.y] = 1; 33 q.push(Node(T.x,T.y,0)); 34 } 35 36 while(!q.empty()) { 37 Node temp = q.front(); 38 q.pop(); 39 for(int i = 0; i < 4; i++) { 40 int fx = temp.x + dir[i][0],fy = temp.y + dir[i][1]; 41 if(!vis1[fx][fy] && s[fx][fy] != '#' && fx >=0 && fx < r && fy >=0 && fy < c) 42 { 43 vis1[fx][fy] = 1; 44 sum1[fx][fy] = temp.num+1; 45 q.push(Node(fx,fy,temp.num+1)); 46 } 47 } 48 } 49 } 50 void bfs2(int x1,int y1) { 51 queue<Node>q; 52 q.push(Node(x1,y1,0)); 53 sum2[x1][y1] = 0; 54 while(!q.empty()) { 55 Node temp = q.front(); 56 q.pop(); 57 for(int i = 0; i < 4; i++) { 58 int fx = temp.x + dir[i][0],fy = temp.y + dir[i][1]; 59 if(!vis2[fx][fy] && s[fx][fy] == '.' && fx >=0 && fx < r && fy >=0 && fy < c) 60 { 61 vis2[fx][fy] = 1; 62 sum2[fx][fy] = temp.num+1; 63 q.push(Node(fx,fy,temp.num+1)); 64 } 65 } 66 } 67 } 68 int main() 69 { 70 int t; 71 cin >> t; 72 while(t--) { 73 mem(sum1,INF); 74 mem(sum2,INF); 75 mem(vis1,0); 76 mem(vis2,0); 77 cin >> r >> c; 78 for(int i = 0; i < r; i++) { 79 cin >> s[i]; 80 } 81 for(int i = 0; i < r; i++) { 82 for(int j = 0; j < c; j++) { 83 if(s[i][j] == 'J') { 84 vis2[i][j] = 1; 85 bfs2(i,j);//搜索人到每个'.'的时间 86 } 87 else if(s[i][j] == 'F') { 88 Q.push(NNode(i,j));//将所有F入队列 89 } 90 } 91 } 92 bfs1();//搜索F到每个'.'的最短时间 93 ll ans = INF; 94 for(int i = 0;i < r;i ++) {//判断边缘第一列和最后一列的点 95 if((s[i][0] == '.'||s[i][0] == 'J') && vis2[i][0] && sum2[i][0] < sum1[i][0]) 96 ans = min(ans,sum2[i][0]); 97 if((s[i][c-1] == '.'||s[i][c-1] == 'J') && vis2[i][c-1] && sum2[i][c-1] < sum1[i][c-1]) 98 ans = min(ans,sum2[i][c-1]); 99 } 100 for(int i = 0;i < c;i ++) {//判断边缘第一行和最后一行的点 101 if((s[0][i] == '.'||s[0][i] == 'J') && vis2[0][i] && sum2[0][i] < sum1[0][i]) 102 ans = min(ans,sum2[0][i]); 103 if((s[r-1][i] == '.'||s[r-1][i] == 'J') && vis2[r-1][i] && sum2[r-1][i] < sum1[r-1][i]) 104 ans = min(ans,sum2[r-1][i]); 105 } 106 if(ans == INF) 107 cout << "IMPOSSIBLE" << endl; 108 else 109 cout << ans+1 << endl;//答案最后要加一因为还要从边缘上的点出去 110 } 111 return 0; 112 }
原文地址:https://www.cnblogs.com/LLLAIH/p/11376730.html
- 【LeetCode 242】 关关的刷题日记36 Valid Anagram
- javascript闭包
- 【LeetCode 438】关关的刷题日记37 Find All Anagrams in a String
- 还在手动给css加前缀?no!几种自动处理css前缀的方法简介
- 算法模板——线段树5(区间开根+区间求和)
- Spring基础篇——通过Java注解和XML配置装配bean
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
- 算法模板——线段树1(区间加法+区间求和)
- 【LeetCode 205】关关的刷题日记38 Isomorphic Strings
- JavaScript基础2---控制权DOM操作
- 算法模板——线段树3(区间覆盖值+区间求和)
- 算法模板——线段树4(区间加+区间乘+区间覆盖值+区间求和)
- 【LeetCode 204】关关的刷题日记39 Count Primes
- 算法模板——并查集 1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python opencv】轮廓更多属性
- Gin 学习之安装和快速启动
- 给兄弟讲bitCoins和blockchain
- Gin 学习之响应处理
- 【python opencv】直方图查找、绘制和分析
- Gin 学习之接收参数和读取 reader
- 【python opencv】二维直方图
- 序列检测一定要用状态机?
- 【python opencv】直方图反投影
- 【python opencv】模板匹配
- 【python opencv】霍夫变换
- python动态柱状图图表可视化:历年软科中国大学排行
- 【MSQL数据库】MySQL中的NULL
- sklearn自带的数据集以及生成数据
- elaticserch的索引