HDU 5652 India and China Origins(二分 + BFS)
本文链接: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)相关推荐
- hdu5652:India and China Origins(并查集)
倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...
- 【HDU 5936 --- Difference】折半枚举+二分
[HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...
- hiho_1139_二分+bfs搜索
题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值. 题目链接:二分 最小化最大值,考虑采用二分搜索.对所有的边 ...
- HDU 1026 Ignatius and the Princess I(BFS)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 在这博客学的 ttp://www.wutianqi.com/?p=2354 感觉看了这个之后收获 ...
- hdu 4417 Super Mario 划分树+二分
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU ACM 1728 逃离迷宫 (广搜BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...
- hdu 4430 Yukari's Birthday(二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430 题意:要在一个蛋糕上放置n个糖果,摆成r个同心圆,每个同心圆的糖果数为k^i,中间圆心可以放一个 ...
最新文章
- 太阳的光和灯光有什么区别_太阳光
- Java的新项目学成在线笔记-day13(九)
- 细说多线程(六) —— 异步 SqlCommand
- oracle双机冷备方案,Oracle 11g双机冷备
- vs设置语言后引用dll的一个错误
- QT的QMessageBox类的使用
- 关于fetch api这点事
- hub设备_ORICO|DIY玩家需要一款高性能的HUB,犹如王者需要一把利器一样
- sql server UI怎么设置自增加id?
- 6 使用soap客户端_SOAP技术应用总结
- 基于Linux的小项目-在线词典
- 《21天学通C语言(第7版)》一6.6 课后研习
- MSE(误差平方和)/RMSE/R²/TSS/RSS
- 我是这样手写Spring的,麻雀虽小五脏俱全
- 医保业务综合服务终端技术规范_增值税发票综合服务平台出口退税业务操作指引...
- python无法读取excel文字_Python帮你做Excel——读取Excel文档
- MySQL中主键和unique的区别
- 万国数据表现不佳的风险很高
- poj 3095 Linear Pachinko 模拟水题
- 微信小程序--自定义组件之搜索框