罗勇军 →《算法竞赛·快冲300题》每日一题:“游泳” ← DFS+剪枝

news/2025/2/22 9:11:08

【题目来源】
http://oj.ecustacm.cn/problem.php?id=1753
http://oj.ecustacm.cn/viewnews.php?id=1023

【题目描述】
游泳池可以等分为n行n列的小区域,每个区域的温度不同。
小明现在在要从游泳池的左上角(1, 1)游到右下角(n, n),小明只能向上下左右四个方向游,不能游出泳池。
而小明对温度十分敏感,他希望你帮他找一条最舒适的路径,使路径上的
最高的水温和最低的水温差值最小。

【输入格式】
第一行输入一个正整数n。
接下来n行,每行n个正整数,表示方阵每个区域的温度a[i][j]。
所有数据保证随机。
(1≤n≤100,1≤a[i][j]≤1000)

【输入格式】
一行一个数表示最小差值。

【输入样例】
4
1 3 10 8
1 4 10 8
1 1 1 1
1 5 8 8

【输出样例】
7

【算法分析】
由于本题规定小明可以往上下左右四个方向游,也就是说可以走回头路,所以不能用动态规划。故依据本题题意,若要找一条最舒适的路径的话,就需要用搜索算法了。
但是,如果简单地遍历出所有路径,再比较得到温差最小路径,肯定超时,必须
剪枝才能减少路径的搜索数量。
如何剪枝?这是本题难点。因为,如果已知最小温差,只需一边游一边检查当前路径上的最大温差,如果已经超过了允许的最小温差,就不用走下去了。但是,
最小温差不能预知,只能猜。最好的方法是使用二分法来猜这个最小温差。本题的解法是“DFS+二分法”。 用“BFS+二分法”也行,请大家思考。

【算法代码】

#include<bits/stdc++.h>
using namespace std;

const int TOP=1000;
const int maxn=105;
int a[maxn][maxn]; //temperature
bool st[maxn][maxn];
int n;
int dx[4]= {-1,0,1,0};
int dy[4]= {0,1,0,-1};

void dfs(int x,int y,int maxt,int mint) {
    if(a[x][y]>maxt || a[x][y]<mint) return; //prune
    st[x][y]=true;
    for(int i=0; i<4; i++) {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(!st[nx][ny] && nx>=1 && nx<=n && ny>=1 && ny<=n)
            dfs(nx,ny,maxt,mint);
    }
}

bool check(int x) {
    for(int i=1; i+x<=TOP; i++) {
        memset(st,0,sizeof(st));
        dfs(1,1,i+x,i);
        if(st[n][n]) return 1;
    }
    return 0;
}

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            scanf("%d",&a[i][j]);
        }
    }

    int le=1,ri=TOP;
    while(le<=ri) {
        int mid=(le+ri)/2;
        if(check(mid)) ri=mid-1;
        else le=mid+1;
    }
    printf("%d",ri+1);

    return 0;
}


/*
in:
4
1 3 10 8
1 4 10 8
1 1 1 1
1 5 8 8

out:
7
*/





【参考文献】
https://blog.csdn.net/weixin_43914593/article/details/131912564


 


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

相关文章

【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)

文章目录 【MySQL】MySQL系统变量&#xff08;system variables&#xff09;列表&#xff08;SHOW VARIABLES 的结果例&#xff09;SHOW VARIABLES 的结果例参考 【免责声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:S…

【C# Programming】编程入门:方法和参数

一、方法 1、方法的定义 由一系列以执行特定的操作或计算结果语句组成。方法总是和类关联&#xff0c;类型将相关的方法分为一组。 方法名称 形参和实参(parameter & argument)返回值 2、命名空间 一种分类机制&#xff0c;用于组合功能相关的所有类型。命名空间是分级…

importance中信息增益和基尼系数

1.信息增益和基尼系数的异同点 信息增益和基尼系数都是用于评价决策树分裂节点的指标,它们有以下主要的相同点和不同点: 相同点: 都用于测度数据集的无序程度(impurity),可以评价分裂后的无序程度减少量取值范围都在0到1之间,0表示完全有序都遵循同一思路,优先选择造成无序程…

rk3568 nvme硬盘分区,格式化,挂载测试

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK rk356x_linux 3.单板 迅为itop-3568开发板 自制底板 一、查看硬盘 插上硬盘上电&#xff0c;进入系统后通过命令lspci查看nvme硬盘识别情况 [rootRK356X:/]# lspci -k 21:00.0 Class 0108: 1e4b:1202…

重新开始 杂类:C++基础

目录 1.输入输出 2 . i 与 i 3.结构体 4.二进制 1.输入输出 #include<cstdio>//cin>>,cout #include<iostream>//printf,scanf &#xff08;1&#xff09; cin , cout输入输出流可直接用于数字&#xff0c;字符 &#xff08;2&#xff09;scanf(&quo…

NestJs 中使用 验证功能

在NestJS 的 管道 学习文章中我们已经接触过 NestJs 中开箱即用的管道。而这篇文章主要是使用ValidationPipe实现更高级的定制功能。 使用内置的 ValidationPipe 因为内置的ValidationPipe管道内置使用了class-validator和class-transformer所以我们首先需要安装这两个库。 …

SpringMVC中文乱码(request或response)前后端处理

前端处理&#xff1a; JSP : <%page pageEncoding"utf-8" %> HTML : <meta charset"UTF-8">后端处理&#xff1a; GET请求&#xff08;request&#xff09;乱码处理&#xff1a; <!-- Tomcat的sever.xml中添加配置&#xff1a;URIEncod…

three.js(一)创建场景添加物体

目录 前言 一、创建Three世界 1.导入Three.js 2.引入three 3.创建基本结构 4.创建场景、相机、渲染器 场景 相机 渲染器 二、向场景中存放物体 1.创建一个物体 几何体 材质 网格模型 前言 官方网站https://threejs.org/网站目录翻译 文档连接https://threejs.org/…