码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 罗勇军 →《算法竞赛·快冲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+二分法”也行,请大家思考。

    【算法代码】

    1. #include
    2. using namespace std;
    3. const int TOP=1000;
    4. const int maxn=105;
    5. int a[maxn][maxn]; //temperature
    6. bool st[maxn][maxn];
    7. int n;
    8. int dx[4]= {-1,0,1,0};
    9. int dy[4]= {0,1,0,-1};
    10. void dfs(int x,int y,int maxt,int mint) {
    11. if(a[x][y]>maxt || a[x][y]return; //prune
    12. st[x][y]=true;
    13. for(int i=0; i<4; i++) {
    14. int nx=x+dx[i];
    15. int ny=y+dy[i];
    16. if(!st[nx][ny] && nx>=1 && nx<=n && ny>=1 && ny<=n)
    17. dfs(nx,ny,maxt,mint);
    18. }
    19. }
    20. bool check(int x) {
    21. for(int i=1; i+x<=TOP; i++) {
    22. memset(st,0,sizeof(st));
    23. dfs(1,1,i+x,i);
    24. if(st[n][n]) return 1;
    25. }
    26. return 0;
    27. }
    28. int main() {
    29. scanf("%d",&n);
    30. for(int i=1; i<=n; i++) {
    31. for(int j=1; j<=n; j++) {
    32. scanf("%d",&a[i][j]);
    33. }
    34. }
    35. int le=1,ri=TOP;
    36. while(le<=ri) {
    37. int mid=(le+ri)/2;
    38. if(check(mid)) ri=mid-1;
    39. else le=mid+1;
    40. }
    41. printf("%d",ri+1);
    42. return 0;
    43. }
    44. /*
    45. in:
    46. 4
    47. 1 3 10 8
    48. 1 4 10 8
    49. 1 1 1 1
    50. 1 5 8 8
    51. out:
    52. 7
    53. */





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


     

  • 相关阅读:
    【无人机】基于PID控制器和A星算法实现无人机路径规划附matlab代码
    图形学 - 纹理映射与重心坐标
    云原生大数据平台零信任网络安全实践技术稿
    智能家居行业发展,密切关注边缘计算和小程序容器技术
    Codeforces 1750B. Maximum Substring
    手把手教你实现buffer(四)——webrtc中的CopyOnWriteBuffer
    001docker架构介绍
    GAN实战笔记——第三章第一个GAN模型:生成手写数字
    elementui-slider 滑动时会重置为0的问题解决
    一文读懂 TsFile
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/132638762
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号