本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html

题意:

  中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表高山不能走过去,白色的代表平原,可以通行,人每次可以选择往上下左右四个方向移动,但是随着时间的变化某些白色的平原会变成黑色的高山,从而变为不可通行,题目中给出一个代表地势的图,然后有 Q 次操作,第 i 次操作 代表在第 i 年 (x, y)处的平原变成了高山,即白色变为了黑色。问中国印度最早彻底断绝的时间,如果在 Q 年后还没有断绝就输出 -1;

思路:

  对于0 - Q年份进行二分,然后利用BFS枚举起点判断连通性。如果在mid年时隔绝已经形成,那么说明答案在[lo-mid]之间,继续二分,否则说明答案在(mid,hi]之间。

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;  const int MAXN = 500;
int Gra[MAXN + 7][MAXN + 7];
int Date[MAXN + 7][MAXN + 7];
int stpX[] = {1, 0, 0, -1};//下一个状态(方向)
int stpY[] = {0, 1, -1, 0};
int visited[MAXN + 7][MAXN + 7];//标记点是否被访问
int n, m;
int flag;struct Point{int x;int y;
}pt[MAXN * MAXN + 7];int chage(int x, int y)
{return (x - 1) * m + y;
}void BFS()//BFS判断连通性
{memset(visited, 0, sizeof(visited));queue<Point> ptQu;struct Point pi;for(int i = 1; i <= m ; i++)//枚举起点{if(Date[1][i] == 1 || visited[1][i]) continue;visited[1][i]= 1;pi.x = 1;pi.y = i;ptQu.push(pi);while(!ptQu.empty()){pi = ptQu.front();ptQu.pop();//cout << pi.x << " " <<pi.y<<endl;if(pi.x == n) {flag = 1;return;} //遍历到了最底下,说明连通for(int i = 0; i < 4; i++){int xx = pi.x + stpX[i];int yy = pi.y + stpY[i];if(Date[xx][yy] == 0 && !visited[xx][yy]){visited[xx][yy] = 1;struct Point temp;temp.x = xx, temp.y = yy;ptQu.push(temp);}}}}
}int isOk(int mid)
{memcpy(Date, Gra, sizeof(Gra));for(int i = 1; i <= mid; i++)Date[ pt[i].x ][ pt[i].y ] = 1;flag = 0;BFS();//cout << mid << endl;if(flag) return 0;return 1;
}int main()
{  //freopen("in.txt", "r", stdin);  int T;  scanf("%d",&T);  while(T--)  {  scanf("%d%d",&n, &m);  memset(Gra, -1, sizeof(Gra));memset(&pt, 0, sizeof(Point));  for(int i = 1; i <= n; i++ )for(int j = 1; j <= m; j++)   scanf("%1d",&Gra[i][j]);int Q;  scanf("%d",&Q);  for(int i = 1; i <= Q; i++){int xx, yy;scanf("%d%d", &xx, &yy);pt[i].x = xx + 1;pt[i].y = yy + 1;}int lo =0;int hi = Q;while(lo <= hi)//二分求解{int mid = (lo + hi) >> 1;if(isOk(mid)) hi = mid - 1;else lo = mid + 1;//printf("%d %d\n",lo, hi);
        }if(hi == Q)printf("-1\n");else printf("%d\n", lo);}  return 0;
} 

转载于:https://www.cnblogs.com/Ash-ly/p/5398867.html

HDU 5652 India and China Origins(二分 + BFS)相关推荐

  1. hdu5652:India and China Origins(并查集)

    倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...

  2. 【HDU 5936 --- Difference】折半枚举+二分

    [HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...

  3. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...

  4. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  5. HDU 1026 Ignatius and the Princess I(BFS)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 在这博客学的 ttp://www.wutianqi.com/?p=2354 感觉看了这个之后收获 ...

  6. hdu 4417 Super Mario 划分树+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...

  7. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. HDU ACM 1728 逃离迷宫 (广搜BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...

  9. hdu 4430 Yukari's Birthday(二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430 题意:要在一个蛋糕上放置n个糖果,摆成r个同心圆,每个同心圆的糖果数为k^i,中间圆心可以放一个 ...

最新文章

  1. 太阳的光和灯光有什么区别_太阳光
  2. Java的新项目学成在线笔记-day13(九)
  3. 细说多线程(六) —— 异步 SqlCommand
  4. oracle双机冷备方案,Oracle 11g双机冷备
  5. vs设置语言后引用dll的一个错误
  6. QT的QMessageBox类的使用
  7. 关于fetch api这点事
  8. hub设备_ORICO|DIY玩家需要一款高性能的HUB,犹如王者需要一把利器一样
  9. sql server UI怎么设置自增加id?
  10. 6 使用soap客户端_SOAP技术应用总结
  11. 基于Linux的小项目-在线词典
  12. 《21天学通C语言(第7版)》一6.6 课后研习
  13. MSE(误差平方和)/RMSE/R²/TSS/RSS
  14. 我是这样手写Spring的,麻雀虽小五脏俱全
  15. 医保业务综合服务终端技术规范_增值税发票综合服务平台出口退税业务操作指引...
  16. python无法读取excel文字_Python帮你做Excel——读取Excel文档
  17. MySQL中主键和unique的区别
  18. 万国数据表现不佳的风险很高
  19. poj 3095 Linear Pachinko 模拟水题
  20. 微信小程序--自定义组件之搜索框

热门文章

  1. Apache-SimpleEmail 简单应用
  2. 为《31天成为IT服务达人》征求正式名字
  3. 使用wrapper将java程序注册程windows服务后不生效
  4. ref 和out 关键字
  5. MDK升级后的头文件冲突
  6. MySQL最早版本源码_MySQL旧版本升级为新版本
  7. PyOpenCV 坐标系统
  8. threshold()
  9. ubuntu 硬盘使用情况
  10. exit(0)与exit(1)、return区别