C - Canyon Crossing(对队列bfs+二分)

news/2024/11/7 15:34:01/

题目链接

题意:n*m的池塘,k个桥,桥的作用是跳过路径上的一个格子,一个人在第n层(最底层),想要走到最上面,求路径中的最小值的最大值是多少。

思路:用二分来枚举路径上的最小值的最大值,bfs检验。bfs要做的事就是,当前只使用大于等于mid的方块和最多k个小于mid的块(就是最多k个桥),能否从第n层到第1层。

queue<node> q[M];  q[ i ] 的意思是到当前点需要用 i 个桥的点。

之后我们先管Q[ 0 ] 看看只用Q[ 0 ] 能否到达, 在过程中需要用桥的存到Q[ 1 ] 中去。 跑完Q[ 0 ] 再去跑Q[ 1 ] 再跑Q[ 2 ] ...

我们在想一下二分,如果当前check成功(结合代码看一下),说明ans可以变大,l=mid+1,否则r=mid-1;

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct node
{int x,y;
}t,d;
int g[M][M];
bool st[M][M];
int n,m,k;
int check(int mid)
{queue<node>q[M];memset(st,0,sizeof st);for(int i=1;i<=m;i++){st[n][i]=1;t.x=n,t.y=i;if(g[n][i]<mid)q[1].push(t);else q[0].push(t);}//把最低下的一层压入对列for(int i=0;i<=k;i++)//遍历一下所有可以用到的桥,只有遍历最大桥,才可以判断是否可以到达{while(q[i].size()){t=q[i].front();q[i].pop();if(t.x==1)return 1;for(int j=0;j<4;j++){d.x=t.x+dx[j];d.y=t.y+dy[j];if(d.x<1||d.x>n||d.y<1||d.y>m)continue;int op=i;if(g[d.x][d.y]<mid)op++;if(!st[d.x][d.y]){q[op].push(d);st[d.x][d.y]=1;}}}}return 0;
}
void solve()
{cin>>n>>m>>k;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>g[i][j];int left=0,right=1e9+1,ans=0;while(left<=right){int mid=left+right>>1;if(check(mid)==1){ans=mid;left=mid+1;}elseright=mid-1;}cout<<ans<<endl;
}signed main()
{Ysanqian;int T;T=1;//cin >> T;while (T--)solve();return 0;
}


http://www.ppmy.cn/news/699062.html

相关文章

电脑的记事本如何显示行和列?

记事本的状态栏可以清楚的显示行数和列数&#xff0c;但要使用记事本的状态栏功能就必须去掉自动换行这个选项。为了让自动换行与状态栏同时存在于记事本中&#xff0c;需要修改注册表值。 按照下列步骤进行 1、打开记事本&#xff0c;把格式--自动换行勾上 2、关闭所有打开的记…

如何找到电脑自带的浏览器

1、找到电脑自带的浏览器&#xff0c;&#xff0c;首先就是进入你的C盘&#xff0c;然后在C盘里找到自己的如下路径 C:\Program Files\internet explorer 找到成功!完成!

电脑能上QQ浏览器却无法打开

1、打开控制面板&#xff0c;查看网络和Internet 2、点击查看网络状态和任务 3、选择更改适配器设置 4、右击网络&#xff08;连上哪个网 点哪个&#xff0c;像我是无线就选WLAN&#xff09;选择属性 5、选择 Internet协议版本4&#xff08;TCP/IPv4&#xff09; 之后点击属性…

html页面当记事本

将下面代码在浏览器(chrome)地址栏输入 data:text/html, <html contenteditable><head><meta charset"utf-8"><title>标题</title></head>可以当作临时的记事本&#xff0c;粘贴一些文字之类&#xff0c;不用每次找记事本记录。…

计算机到点就有音乐怎么清除缓存垃圾,QQ音乐缓存文件在哪 QQ音乐缓存清理方法-电脑教程...

对于一些喜欢经常使用QQ音乐播放器&#xff0c;在电脑中听歌的朋友来说&#xff0c;一段时间后&#xff0c;QQ音乐会产生很多缓存垃圾文件&#xff0c;而使用一般的安全软件又无法清理&#xff0c;通常只能手动清空QQ音乐缓存解决。如果您电脑硬盘容量不大的话&#xff0c;建议…

记事本(notepad.exe)编码的解惑

文章目录 前言一、为什么会出现记事本以各种编码的另存都无法存为原文件大小的文件&#xff0c;且以原二进制文件的打开方式再也无法打开的现象&#xff1f;二、记事本的默认解码方式三、为什么会不一样的解释总结 前言 为什么将一个二进制文件用记事本读取后点击保存&#xf…

显示计算机窗口地址栏,电脑QQ浏览器中在地址栏显示最常访问功能怎么开启

电脑QQ浏览器中在地址栏显示最常访问功能怎么开启 腾讯视频/爱奇艺/优酷/外卖 充值4折起 QQ浏览器是我们现在经常在电脑上使用的浏览器软件之一&#xff0c;为了方便我们的访问我们可以开启浏览器中的在地址栏显示最常访问的功能。接下来小编就教大家怎样操作。 具体如下&#…

html默认Ie8打开,修改IE8浏览器查看源文件为记事本打开

IE8默认的查看源文件编辑器已不再是记事本&#xff0c;但是还是有很多用户习惯在IE6浏览器的记事本为默认程序。虽然记事本功能简单&#xff0c;却有它好用的地方&#xff0c;它能提供提供更好的灵活性&#xff0c;例如在HTML源代码里直接编辑&#xff0c;看到喜欢的内容&#…