其实写一个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 (水搜索)相关推荐

  1. fzu 2150 Fire Game 【身手BFS】

    称号:fzu 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧全部 ...

  2. hdu5012 水搜索

    题意:       给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路:        ...

  3. FZU 2150 Fire Game bfs

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103921#problem/I bfs水题.好像还做过一次了.思路题意都见代码吧 ...

  4. FZU 2150 Fire Game

    点击打开链接 Problem 2150 Fire Game Accept: 237    Submit: 808 Time Limit: 1000 mSec    Memory Limit : 327 ...

  5. hdu4771 水搜索(状态压缩+bfs)

    题意:      给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...

  6. hdu1572 水搜索

    题意: 中文的不解释; 思路:           其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...

  7. hdu2102 水搜索

    题意: A计划 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说 ...

  8. hdu4536 水搜索

    题意: XCOM Enemy Unknown Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...

  9. 搜索复习-基础水题(一共12道)

    由于是跟着黄学长刷题,此篇博文里所有JudgeOnline都是http://218.5.5.242:9018/JudgeOnline/ tyvj1080 N皇后 描述 检查一个如下的6 x 6的跳棋棋 ...

最新文章

  1. u盘文件看得见却打不开_win7下u盘文件打不开怎么办 win7下u盘文件打不开解决方法...
  2. 初探Tomcat的架构设计
  3. android常用组件之RadioGroup
  4. 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍
  5. leetcode-回文链表
  6. 前端学习(3349):数组方法的运用和数值
  7. 小程序新闻列表页面布局代码_论坛小程序·“我的”页面布局
  8. mysql order by random,sql-MySQL:ORDER BY RAND()的替代方法
  9. mybatis扩展ResultMap
  10. bzoj 2844 子集异或和名次
  11. 手动构建redis集群
  12. 中国为什么不能成为国际数据中心枢纽
  13. C++--第26课 - 异常处理 - 下
  14. 【图像隐写】基于matlab GUI DWT与SVD数字水印 【含Matlab源码 253期】
  15. SQL盲注中的部分常用函数
  16. 运行VS编译的程序提示“由于应用程序配置不正确,应用程序未能启动”的问题
  17. oracle primavera p6 破解版,P6项目管理软件下载 Primavera P6 Professional(项目管理软件) 16.1 免费安装版(附安装教程) 下载-脚本之家...
  18. android辅助功能失效,如果其他应用的辅助功能服务处于开启状态,则Android无障碍服务无法正常工作...
  19. 装修服务转战线上,VR全景为您解决装修行业痛点!
  20. HTML5实时显示摄像头视频

热门文章

  1. Modbus 通信协议详解
  2. 永磁同步电机凸极和隐极之间的区别
  3. 用Python帮老哥选出好基金,稳赚一笔,老哥专门提着茅台登门拜访
  4. contiki学习笔记之leds
  5. ubuntuPC机安装JLink驱动
  6. 智慧物业管理系统——总结
  7. 金刚经知识地图(下)
  8. cURL error 1014: SSL verify failed
  9. pyautogui 滑动页面_PyAutoGUI使用
  10. 面向服务架构SOA相关概念