Fire Game FZU - 2150 (水搜索)
其实写一个spfa就行 遍历所有的草的点 组合两个
求最大时间的最小
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <list> #include <cmath> #include <bitset> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define rd(a) scanf("%d", &a) #define rlld(a) scanf("%lld", &a) #define rc(a) scanf("%c", &a) #define rs(a) scanf("%s", a) #define rb(a) scanf("%lf", &a) #define rf(a) scanf("%f", &a) #define pd(a) printf("%d\n", a) #define plld(a) printf("%lld\n", a) #define pc(a) printf("%c\n", a) #define ps(a) printf("%s\n", a) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 110000, INF = 0x7fffffff;int n, m; string str[15]; int dis[4][2] = {{1, 0},{-1, 0},{0, 1},{0, -1}}; int vis[15][15], vis1[15][15], d[15][15];void dfs(int x, int y, int cnt) {for(int i = 0; i < 4; i++){int nx = x + dis[i][0];int ny = y + dis[i][1];if(nx < 0 || nx >= n || ny < 0 || ny >=m || str[nx][ny] == '.' || vis[nx][ny]) continue;vis[nx][ny] = cnt;dfs(nx, ny, cnt);} }struct node {int x, y;node(int x, int y) : x(x), y(y) {} };int spfa(int x, int y) {for(int i = 0; i <= n; i++)for(int j = 0; j <= m; j++) d[i][j] = INF;vector<node> f;mem(vis1, 0);queue<node> Q;Q.push(node(x, y));vis1[x][y] = 1;d[x][y] = 0;while(!Q.empty()){node u = Q.front(); Q.pop();f.push_back(u);vis1[u.x][u.y] = 0;for(int i = 0; i < 4; i++){node t = node(0, 0);t.x = u.x + dis[i][0];t.y = u.y + dis[i][1];if(t.x < 0 || t.x >= n || t.y < 0 || t.y >= m || str[t.x][t.y] == '.') continue;if(d[t.x][t.y] > d[u.x][u.y] + 1){d[t.x][t.y] = d[u.x][u.y] + 1;if(!vis1[t.x][t.y]){vis1[t.x][t.y] = 1;Q.push(t);}}}}int mx = -INF;for(int i = 0; i < f.size(); i++){mx = max(mx, d[f[i].x][f[i].y]);}return mx; }set<int> s1, s2;vector<node> G;int bfs(int x1, int y1, int x2, int y2) {queue<node> Q;for(int i = 0; i <= n; i++)for(int j = 0; j <= m; j++) d[i][j] = INF;vector<node> f;d[x1][y1] = d[x2][y2] = 0;Q.push(node(x1, y1)); Q.push(node(x2, y2));mem(vis1, 0);vis1[x1][y1] = 1, vis1[x2][y2] = 1;while(!Q.empty()){node u = Q.front(); Q.pop();f.push_back(u);vis1[u.x][u.y] = 0;for(int i = 0; i < 4; i++){node t = node(0, 0);t.x = u.x + dis[i][0];t.y = u.y + dis[i][1];if(t.x < 0 || t.x >= n || t.y < 0 || t.y >= m || str[t.x][t.y] == '.') continue;if(d[t.x][t.y] > d[u.x][u.y] + 1){d[t.x][t.y] = d[u.x][u.y] + 1;if(!vis1[t.x][t.y]){vis1[t.x][t.y] = 1;Q.push(t);}}}}int mx = -INF;for(int i = 0; i < f.size(); i++){mx = max(mx, d[f[i].x][f[i].y]);}return mx;}int main() {int T, kase = 0;rd(T);while(T--){s1.clear();s2.clear();mem(vis, 0);int cnt = 0;G.clear();rd(n), rd(m);for(int i = 0; i < n; i++){cin >> str[i];for(int j = 0; j < m; j++)if(str[i][j] == '#') G.push_back(node(i, j));}// cout << 11111 <<endl;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(!vis[i][j] && str[i][j] == '#'){cnt++;vis[i][j] = cnt;dfs(i, j, cnt);}//cout << cnt << endl;printf("Case %d: ", ++kase);if(cnt > 2){printf("-1\n");continue;}if(cnt == 0){printf("0\n");continue;}if(cnt == 1){for(int i = 0; i < G.size(); i++){node u1 = G[i];for(int j = i + 1; j < G.size(); j++){node u2 = G[j];s1.insert(bfs(u1.x, u1.y, u2.x, u2.y));}}set<int>::iterator it;it = s1.begin();cout << *it << endl;continue;}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(str[i][j] == '#'){if(vis[i][j] == 1)s1.insert(spfa(i, j));elses2.insert(spfa(i, j));}}}set<int>::iterator it, is;it = s1.begin();is = s2.begin();int mxx = max(*it, *is);cout << mxx << endl;}return 0; }
转载于:https://www.cnblogs.com/WTSRUVF/p/10808927.html
Fire Game FZU - 2150 (水搜索)相关推荐
- fzu 2150 Fire Game 【身手BFS】
称号:fzu 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧全部 ...
- hdu5012 水搜索
题意: 给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路: ...
- FZU 2150 Fire Game bfs
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103921#problem/I bfs水题.好像还做过一次了.思路题意都见代码吧 ...
- FZU 2150 Fire Game
点击打开链接 Problem 2150 Fire Game Accept: 237 Submit: 808 Time Limit: 1000 mSec Memory Limit : 327 ...
- hdu4771 水搜索(状态压缩+bfs)
题意: 给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...
- hdu1572 水搜索
题意: 中文的不解释; 思路: 其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...
- hdu2102 水搜索
题意: A计划 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说 ...
- hdu4536 水搜索
题意: XCOM Enemy Unknown Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- 搜索复习-基础水题(一共12道)
由于是跟着黄学长刷题,此篇博文里所有JudgeOnline都是http://218.5.5.242:9018/JudgeOnline/ tyvj1080 N皇后 描述 检查一个如下的6 x 6的跳棋棋 ...
最新文章
- u盘文件看得见却打不开_win7下u盘文件打不开怎么办 win7下u盘文件打不开解决方法...
- 初探Tomcat的架构设计
- android常用组件之RadioGroup
- 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍
- leetcode-回文链表
- 前端学习(3349):数组方法的运用和数值
- 小程序新闻列表页面布局代码_论坛小程序·“我的”页面布局
- mysql order by random,sql-MySQL:ORDER BY RAND()的替代方法
- mybatis扩展ResultMap
- bzoj 2844 子集异或和名次
- 手动构建redis集群
- 中国为什么不能成为国际数据中心枢纽
- C++--第26课 - 异常处理 - 下
- 【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】
- SQL盲注中的部分常用函数
- 运行VS编译的程序提示“由于应用程序配置不正确,应用程序未能启动”的问题
- oracle primavera p6 破解版,P6项目管理软件下载 Primavera P6 Professional(项目管理软件) 16.1 免费安装版(附安装教程) 下载-脚本之家...
- android辅助功能失效,如果其他应用的辅助功能服务处于开启状态,则Android无障碍服务无法正常工作...
- 装修服务转战线上,VR全景为您解决装修行业痛点!
- HTML5实时显示摄像头视频