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

news/2024/6/29 11:50:02 标签: 宽度优先, 算法, c++, 二分

题目链接

题意: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;
		}
		else
		right=mid-1;
	}
	cout<<ans<<endl;
}

signed main()
{
	Ysanqian;
	int T;
	T=1;
	//cin >> T;
	while (T--)solve();
	return 0;
}


http://www.niftyadmin.cn/n/1008590.html

相关文章

C#编程的其他概念

目录 面向对象的编程 模式匹配 弃元 面向对象的编程 C# 是面向对象的编程语言。 面向对象编程的四项基本原则为&#xff1a; 抽象&#xff1a;将实体的相关特性和交互建模为类&#xff0c;以定义系统的抽象表示。封装&#xff1a;隐藏对象的内部状态和功能&#xff0c;并仅…

完美selenium将某套壳chatgpt网站变为api

import time from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options# 导入keys类包 # import pyperclip # from pywinauto.keyboard import send_keys# 合成urls # url_list=[head…

华为OD机试真题 Python 实现【机器人活动区域】【2023Q1 200分】

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 现有一个机器人&#xff0c;可放置于 M N的网格中任意位置&#xff0c;每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时&a…

实用调试技巧(2)

实用调试技巧——详解 前言&#xff1a;一、调试实例1.1 实例一1.2 实例二 二、如何写出好&#xff08;易于调试)的代码2.1 什么是优秀的代码2.2 assert和const的介绍 三、编程常见的错误3.1 编译型错误3.2 链接型错误3.3运行时错误 前言&#xff1a; 这里调试技巧&#xff08…

【JUC(三)】中断与等待唤醒

1. interrupt() 相关方法 interrupt(),interrupted() 和 isinterrupted() 的区别 public void interrupt()&#xff1a;将线程的中断标记设置为 true&#xff0c;并不是真的停止该线程。 如果线程处于 wait()、join()、sleep() 方法的阻塞当中。中断标记会被清除。也就是通过…

uview-plus上传图片,upload组件带参数上传

一、引入uview-plus 请自行在项目中引入uview-plus组件库&#xff0c;此处不多赘述 二、使用 html 部分&#xff0c;上传组件的样式自己去定义&#xff0c;不多赘述 <u-upload:fileList"fileList" // 文列列表afterRead"afterRead" // 读取后的…

【C++面向对象】足球比赛数据统计系统(面向对象练习)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…

阿里云ECS U实例评测

参与ECSU实例评测&#xff0c;申请免费体验机会&#xff1a;https://developer.aliyun.com/mission/review/ecsu What u1实例是什么&#xff1f; u1实例本质上还是ecs服务器&#xff0c;但是是阿里云推出的一种新型实例规格族 阿里云根据使用场景和业务场景将ecs划分为不同的…