(二分+区间搜索 )Mountain Walking(poj2110/poj2922)

题目

农夫约翰和贝西牛已经开始了其中一个“积极”的假期。他们整天都在山里散步,然后在一天结束时,他们厌倦了回到度假小屋。

由于攀爬需要大量能量并且已经疲惫,他们希望使用其最高和最低高度之间的差异最小的路径返回到机舱,无论路径有多长。帮助FJ找到这条易于移动的路径。

山的地图由N×N(2 <= N <= 100)整数高程矩阵给出(0 <=任意高程<= 110)FJ和Bessie当前位于左上角位置(第1行,列) 1)并且舱室位于右下方(第N行,第N列)。它们可以向右,向左,向顶部或向网格底部移动。他们不能在对角线上旅行。
输入
*第1行:单个整数,N

*行2…N + 1:每行包含N个整数,每个整数指定一个正方形的高度。第2行包含网格的第一行(顶部); 第3行包含第二行,依此类推。该行上的第一个数字对应于网格的第一个(左)列,依此类推。
产量
*第1行:一个整数,它是最佳路径上的最小高度差。
样本输入
5
1 1 3 6 8
1 2 2 5 5
4 4 0 3 3
8 0 2 3 4
4 3 0 2 1
样本输出
2

分析与解答

这题根滑雪那到一样,用普通的搜索根本没法写,因为广搜每个节点只访问一次,而这个并不是只找一条路。深搜的话找路径需要记录当前DFS路径上所遇到所有点的高度,有些路径中的某个点高度过高,一看就知道不需要走,但是深搜还是要走,所以时间上浪费

这题利用二分,我们二分的是个高度差,就是说当前高度差处于[low,up]这个区间的范围之中,对于这个区间[low,up]我们用BFS找,看看能不能找到一条从左上角到右下角的路,

我们bfs参数是数的高度,他们的高度差我们二分出来了,现在就不断枚举所有可能的起止高度进行遍历,比如高度差位mid,那么区间就是(low,low+mid)low从一递增到一百一.。只要有一个路径的数都在区间里面我们就return
bfs从(1,1)开始搜,先判断起点是不是在区间范围内,不是的话返回,是的话入队,然后只要队不空,取队首,然后上下左右移动,一般的bfs,只要是第一次出现,在这个区域内,就入队了,这个区间的bfs 是有选择的入队,只有属于我们规定的的区间的我们才让他入队,就这么一直如下去,如果碰到这个坐标是(n,n)就说明已经找到了属于这个区间的路径,返回true
注意两个if的顺序,四个方向能走的不一定在这个区间里

参考代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=105;
int map[maxn][maxn];
int vis[maxn][maxn];
int n;
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node{int x,y;
};int bfs(int l,int r)
{if(map[1][1]<l||map[1][1]>r) return 0;queue<node> q;node k;k.x=1;k.y=1;q.push(k);vis[1][1]=1;while(!q.empty()){node a,b;b=q.front();q.pop();int x=b.x;int y=b.y;for(int j=0;j<4;++j){int ax=x+to[j][0];int ay=y+to[j][1];if(ax>=1&&ax<=n&&ay>=1&&ay<=n&&!vis[ax][ay]){vis[ax][ay]=1;if(map[ax][ay]>=l&&map[ax][ay]<=r){if(ax==n&&ay==n) return true; a.x=ax;a.y=ay;q.push(a);}}}}return false;}int check(int d){for(int i=0;i+d<=110;i++){memset(vis,0,sizeof(vis));if(bfs(i,i+d)) return 1; }return false;}
int main()
{scanf("%d",&n);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%d",&map[i][j]);int l=0,r=110;while(r>l){int mid = (r+l)/2;if(check(mid)) r=mid;else l=mid+1;}printf("%d\n",r);return 0;
}
}

欣赏一下dfs

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+5;
int n;
int map[maxn][maxn];
int vis[maxn][maxn];//判断当前节点时候被走过
int max_v,min_v;
int dr[]={-1,1,0,0};//上下左右
int dc[]={0,0,-1,1};
bool dfs(int r,int c,int low,int up)
{vis[r][c]=1;                                              //错误,这里之前vis放到了if下面if(map[r][c]>up || map[r][c]<low) return false;if(r==n&&c==n) return true; //到达终点for(int dir=0;dir<4;dir++){int nr=r+dr[dir],nc=c+dc[dir];if(nr>=1&&nr<=n&&nc>=1&&nc<=n&&!vis[nr][nc])if(dfs(nr,nc,low,up)) return true;                //错误,这里忘了返回true了}return false;
}
bool check(int d)
{for(int low=0;low+d<=200;low++){memset(vis,0,sizeof(vis));                      //错误,这里memset放到了for上面if(dfs(1,1,low,low+d)) return true;}return false;
}
int main()
{int T; scanf("%d",&T);for(int kase=1;kase<=T;kase++){scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);int L=0,R=200;while(R>L){int mid=(R+L)>>1;if(check(mid)) R=mid;else L=mid+1;}//printf("Scenario #%d:\n%d\n\n",kase,R);printf("%d\n",R);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化操作应用程序错误_web自动化中踩过的低级错误坑(python+selenium)

1.定位了元素没有做下一步操作&#xff0c;比如&#xff0c;点击、输入等功能&#xff0c;而报错&#xff0c;报错信息如下&#xff1a;2.上传图片时&#xff0c;定位元素&#xff0c;应该定位input标签&#xff0c;点击页面input标签肉眼没有看到定位到任何元素&#xff0c;以…

(全排列)Smallest Difference (poj2718)

题目&#xff1a; Description - 题目描述 给定若干位十进制数&#xff0c;你可以通过选择一个非空子集并以某种顺序构建一个数。剩余元素可以用相同规则构建第二个数。除非构造的数恰好为0&#xff0c;否则不能以0打头。 举例来说&#xff0c;给定数字0&#xff0c;1&#x…

qgis折点打断_arcgis在折点处打断并建立网络分析(最短路径等问题)

目的&#xff1a;GIS网络分析用于对段路径等问题。这里仅仅讲述如何建立网络分析。网络建立前必须满足以下条件1.要素文件在节点处打断(本文下面会叙述)2.要素文件在地理数据库里的数据集里(一般是这样)3.要素文件包含的数据集里已经验证拓扑&#xff0c;并确保没有错误(可选)注…

(bfs)连连看(hdu1175)

题目&#xff1a; “连连看”相信很多人都玩过。没玩过也没关系&#xff0c;下面我给大家介绍一下游戏规则&#xff1a;在一个棋盘中&#xff0c;放了很多的棋子。如果某两个相同的棋子&#xff0c;可以通过一条线连起来&#xff08;这条线不能经过其它棋子&#xff09;&#…

base64 java php_利用PHP将图片转换成base64编码的实现方法

先来说一下为什么我们要对图片base64编码base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一。base64主要不是加密&#xff0c;它主要的用途是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字符&#xff0c;不能直接传送&…

(BFS)Knight Moves(hdu1372)

题目&#xff1a; 在象棋王国&#xff0c;尼古拉斯.火山是一匹英俊的马&#xff0c;他非常幸运迎娶了白马王国的公主&#xff0c;他们将度蜜月&#xff0c;你现在是他们的女仆&#xff0c;火山会问你去一些地方最少需要多少步&#xff0c;这么简单的事当然难不倒你。由于火山是…

java上机作业要注意什么_Java第八次上机作业

1、请按照以下要求设计一个学生类Student&#xff0c;并进行测试。要求如下&#xff1a;1)Student类中包含姓名、成绩两个属性2)分别给这两个属性定义两个方法&#xff0c;一个方法用于设置值&#xff0c;另一个方法用于获取值.3)Student类中定义一个无参的构造方法和一个接收两…

(枚举)餐厅点餐(fzu2086)

问题&#xff1a; Jack最近喜欢到学校餐厅吃饭&#xff0c;好吃干净还便宜。 在学校餐厅&#xff0c;有a种汤&#xff0c;b种饭&#xff0c;c种面条&#xff0c;d种荤菜&#xff0c;e种素菜。 为了保证膳食搭配&#xff0c;Jack每顿饭都会点1~2样荤菜&#xff0c;1~2样素菜&…

java代下订单管理模块_用java语言开发一个订单管理系统

管理员登陆窗体(LoginForm)&#xff1a;窗体中包含“管理员姓名”&#xff0c;“管理员密码”,按钮:"确定","取消"操作主窗体(MainFrame)&#xff1a;包括&#xff1a;1、一个Jtable用来显示数据库中Orders表(订单表)中的...管理员登陆窗体(LoginForm)&…

(并查集)畅通工程

题目 某省调查城镇交通状况&#xff0c;得到现有城镇道路统计表&#xff0c;表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通&#xff08;但不一定有直接的道路相连&#xff0c;只要互相间接通过道路可达即可&#xff09;。…

java windows 2008_Windows server 2008 R2 安装Java环境

一、配置环境操作系统软件包Windows server 2008 R2jdk_1.7.rar二、安装操作1.右击解压jdk_1.7.rar&#xff1b;解压后双击运行jdk-7u79-windows-i586 .exe2.点击【下一步】一直到有个【更改】按钮&#xff0c;可以更改安装路径&#xff0c;设置完成后点击“下一步”。到达这个…

(kruskal)还是畅通工程

题目&#xff1a; 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&#xff0c;并要…

java 匿名类型_Java之匿名类讲解

匿名类&#xff0c;正如名字一样在java中没有名字标识的类&#xff0c;当然了编译后还是会安排一个名字的。下面是一个关于匿名类的简单例子&#xff1a;public classClient {public static voidmain(String[] args) throws InterruptedException {Thread tnew Thread(newRunna…

(并查集)小希的迷宫

题目&#xff1a; 上次Gardon的迷宫城堡小希玩了很久&#xff08;见Problem B&#xff09;&#xff0c;现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样&#xff0c;首先她认为所有的通道都应该是双向连通的&#xff0c;就是说如果有一个通道连通了房间A和B&…

java的三个环境变量是啥_JAVA中常用需要设置的三个环境变量(JAVA_HOME、CLASSPATH、PATH)...

JAVA中常用需要设置的三个环境变量:JAVA_HOME、CLASSPATH、PATH(一)  配置环境变量&#xff1a;(相对路径)1. JAVA_HOMEx:/jdk1.6.02. 用%JAVA_HOME%就可以取代:x:/jdk1.6.0这一部分CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/activation.jar…

(并查集)The Suspects

题目 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others. In the Not-Spre…

java字节流分为_Java文件流可分为字节流和字符流。

【单选题】TCP 和 UDP 协议的相似之处是 ()【单选题】That was the first time I ______ French with a foreigner.【判断题】【判断题】对互联网和搜索引擎的应用是奥巴马连续淘汰希拉里、麦凯恩等竞争对手的法宝之一。【单选题】friend意为“朋友”,请问,“友谊”如何表达?【…

(最小生成树)prim算法

总结一下&#xff1a; 如果选 0为起点&#xff0c;low_cost[i]表示以 0这个起点到i 这个终点的权值&#xff0c;我们找最小的权值的终点i&#xff0c;然后以i为起点&#xff0c;去更新low_cost[]这个数组&#xff0c;如果与i相连的数是j&#xff0c;现在有两种情况&#xff0c…

Java调用虚拟键盘输入法_Android 点击屏幕空白处收起输入法软键盘(手动打开)...

很多时候&#xff0c;我们在使用应用时&#xff0c;会出现输入法软键盘弹出的问题&#xff0c;通常情况下&#xff0c;我们默认会使用户点击返回键或者下一步对软键盘进行隐藏。为了更好的体验&#xff0c;我们可以实现当用户使用完毕软键盘时。点击屏幕空白区域即可实现收起输…

(并查集)Find them, Catch them

题目 The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present question is…