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

【题目来源】
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+二分法"也行,请大家思考。

【算法代码】

cpp 复制代码
#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

相关推荐
让我们一起加油好吗5 天前
【基础算法】初识搜索:递归型枚举与回溯剪枝
c++·算法·剪枝·回溯·洛谷·搜索
严文文-Chris7 天前
【大模型量化、蒸馏、剪枝、微调小结】
算法·机器学习·剪枝
手握风云-8 天前
回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(一)
算法·机器学习·剪枝
CUC-MenG16 天前
2025牛客多校第九场 G.排列 A.AVL树 F.军训 个人题解
数学·dfs·dp·笛卡尔树·组合数·曼哈顿距离·树上dp
是阿建吖!17 天前
【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
算法·bfs·剪枝
爱分享的飘哥19 天前
第六十一章:AI 模型的“视频加速术”:Wan视频扩散模型优化
人工智能·剪枝·tensorrt·量化·模型优化·视频扩散模型·cuda graph
qiuyunoqy21 天前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
麦兜*22 天前
Spring Boot整合PyTorch Pruning工具链,模型瘦身手术
java·pytorch·spring boot·后端·spring cloud·ai编程·剪枝
CUC-MenG24 天前
快速莫比乌斯变换(FMT)与莫比乌斯反演 例题:树上lcm
数学·dfs·fmt
CUC-MenG25 天前
2025牛客多校第五场 K.完美旅程 J.最快覆盖问题 E.神秘异或操作 个人题解
数学·dfs·bfs·优先队列·二分·位运算·fmt·曼哈顿距离·fwt