算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

游泳” ,链接: http://oj.ecustacm.cn/problem.php?id=1753

题目描述

【题目描述】 游泳池可以等分为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

题解

   在图上找一条路径,如果是最短路径,用BFS最好;如果用DFS,会导致搜索大量路径,必须剪枝才能减少搜索。如果不是最短路径,用DFS更好编码更简单,注意也需要剪枝。
   本题要求找一条温差最小的路径,如果简单地遍历出所有路径,再比较得到温差最小路径,肯定超时,因为总路径数量是 O ( 4 n ) O(4^n) O(4n)的。必须剪枝才能减少路径的搜索数量。
   如何剪枝?如果已知最小温差,只要一边游一边检查当前路径上的最大温差,如果已经超过了允许的最小温差,就不用走下去了。但是最小温差不能预知,只能猜,最好的方法是使用二分法来猜这个最小温差。本题的解法是“DFS + 二分法”。 用“BFS+二分法”也行,请读者思考。
【重点】 DFS+二分法。

C++代码

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int a[N][N];           //温度
bool vis[N][N];        //是否已经访问过
int dx[4] = {1,-1,0,0}, dy[4] = {0,0,1,-1};  //上下左右四个方向
void dfs(int x,int y,int t_max,int t_min){if(a[x][y] > t_max || a[x][y] < t_min) return;  //剪枝vis[x][y] = true;for(int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if(!vis[nx][ny] && nx >= 1 && nx <= n && ny >= 1 && ny <= n)dfs(nx,ny,t_max,t_min);}
}
bool check(int x){for(int i = 1; i + x <= 1000; i++){memset(vis,0,sizeof vis);dfs(1,1,i + x,i);if(vis[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 left = 0,right = 1000;while(left+1 < right){int mid = (left + right)/2;if(check(mid)) right = mid;else left = mid;}printf("%d",right);return 0;
}

Java代码

import java.util.*;public class Main {static final int N = 110;static int n;static int[][] a = new int[N][N]; // 温度static boolean[][] vis = new boolean[N][N]; // 是否已经访问过static int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1}; // 上下左右四个方向public static void main(String[] args) {Scanner scan = new Scanner(System.in);n = scan.nextInt();for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)a[i][j] = scan.nextInt();int left = 0, right = 1000;while (left + 1 < right) {int mid = (left + right) / 2;if (check(mid))  right = mid;else             left = mid;}System.out.println(right);scan.close();}static boolean check(int x) {for (int i = 1; i + x <= 1000; i++) {memset(vis, false);dfs(1, 1, i + x, i);if (vis[n][n])  return true;}return false;}static void dfs(int x, int y, int t_max, int t_min) {if (a[x][y] > t_max || a[x][y] < t_min)  return; // 剪枝vis[x][y] = true;for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];if (!vis[nx][ny] && nx >= 1 && nx <= n && ny >= 1 && ny <= n)dfs(nx, ny, t_max, t_min);}}static void memset(boolean[][] arr, boolean val) {for (int i = 0; i < arr.length; i++)Arrays.fill(arr[i], val);}
}

Python代码

import sys
sys.setrecursionlimit(1000000)
N = 110
n = int(input())
a = [[0]*N for _ in range(N)]  # 温度
vis = [[False]*(N) for _ in range(N)]  # 是否已经访问过
dx, dy = [1, -1, 0, 0], [0, 0, 1, -1]  # 上下左右四个方向
def dfs(x, y, t_max, t_min):if a[x][y] > t_max or a[x][y] < t_min:  return  # 剪枝vis[x][y] = Truefor i in range(4):nx = x + dx[i]ny = y + dy[i]if (not vis[nx][ny]) and 1 <= nx <= n and 1 <= ny <= n:dfs(nx, ny, t_max, t_min)
def check(x):for i in range(1, 1000 - x + 1):global visvis = [[False]*N for _ in range(N)]dfs(1, 1, i + x, i)if vis[n][n]:  return Truereturn False
for i in range(1,n+1):a[i] = [0] + list(map(int, input().split()))
print(a[n][n])
left, right = 0, 1000
while left + 1 < right:mid = (left + right) // 2if check(mid):  right = midelse:        left = mid
print(right)

《算法竞赛·快冲300题》每日一题:“游泳”相关推荐

  1. Leetcode刷题——每日一题题目汇总

    系列文章目录 文章目录 系列文章目录 查找遍历 169. 多数元素 219. 存在重复元素 II 717. 1比特与2比特字符 917. 仅仅反转字母 1725. 可以形成最大正方形的矩形数目 排序 ...

  2. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  3. 算法竞赛入门经典 习题3-2 分子量 Molar Mass

    给出一种物质的分子式(不带括号),求其分子量.本题分子式中只包含四种原子,分别为C.H.O.N,原子量分别为12.01,1.008,16.00,14.01.例如,C6H5OH的分子量为94.108g/ ...

  4. LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

    LeetCode 每日一题 42. 接雨水 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油吧~ 难度 困难 2020.04.04每日一题 ...

  5. 算法竞赛入门【码蹄集进阶塔335题】(MT2330-2335)

    算法竞赛入门[码蹄集进阶塔335题](MT3330-3335) 文章目录 算法竞赛入门[码蹄集进阶塔335题](MT3330-3335) 前言 为什么突然想学算法了? 为什么选择码蹄集作为刷题软件? ...

  6. 光刷题不参加这些算法竞赛?太亏了!

    前言 大家好,我是bigsai.这篇文章给大家介绍算法竞赛,如果有帮助还请一键三连支持一下! 最近有些学妹问我咱们计算机专业的有哪些比赛可以参加呢?我眉头一皱,想了想咱们计算机专业竞赛好像确实蛮多的, ...

  7. 【算法竞赛学习】金融风控之贷款违约预测-赛题理解

    Task1 赛题理解 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题.通过这道赛题来引导大家了解金融风控中的 ...

  8. 算法竞赛入门【码蹄集进阶塔335题】(MT2001-2025)

    算法竞赛入门[码蹄集进阶塔335题](MT2001-2025) 文章目录 算法竞赛入门[码蹄集进阶塔335题](MT2001-2025) 前言 为什么突然想学算法了? 为什么选择码蹄集作为刷题软件? ...

  9. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day23】—— 算法1

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  10. 算法竞赛入门【码蹄集进阶塔335题】(MT2311-2315)

    算法竞赛入门[码蹄集进阶塔335题]MT2311-2315 文章目录 算法竞赛入门[码蹄集进阶塔335题]MT2311-2315 前言 为什么突然想学算法了? 为什么选择码蹄集作为刷题软件? 目录 1 ...

最新文章

  1. 科大讯飞语音助手Lite智能鼠标电脑版安装不成功为什么?怎么办?
  2. 在oracle备份数据库,Oracle在A机器上备份了数据库,到B机器上恢复时,怎么进行下去?...
  3. storm 简介及单机版安装指南
  4. POJ2527(两多项式取余)
  5. 人工智能计算机的相关信息,关于人工智能,计算机领域的尖端(三)
  6. firebase连接不上_如何在Firebase上托管Blazor应用程序
  7. 精雕道路怎么遍弧形_有网友私信我问郑州融信奥体世纪这个楼盘怎么样他今天来...
  8. docker 搭建mysql 连接不上_docker搭建MySQL主从集群
  9. Linux的常用指令
  10. 11.history命令历史
  11. win8/10 bcdboot引导修复命令的原理和使用方法
  12. 荣耀手机安装谷歌框架_华为荣耀9青春版安装谷歌框架 无需Root 华为荣耀手机安装谷歌框架...
  13. cad无法安装_CAD软件下载好了,为什么安装不上?有两个原因,解决方法在这
  14. 微信小程序生命周期和路由传参详解
  15. 线程中的同步和异步的区别
  16. 算法练习(21):Frog Jump
  17. Jaeger入门简介
  18. might和could的区别用法_情态动词may与might用法
  19. Nelder_Mead算法的简介和用作求解二维函数最小值的Python实现
  20. 用java编写博弈树_MathorCup竞赛优秀论文基于MonteCarlo局面评估和UCT博弈树搜索的...

热门文章

  1. VMWare虚拟机文件夹共享不生效--记录解决贴
  2. 考研-寒假日记(大三) ZERO
  3. [C++]VS2015 update2的安全检测:decorated name length exceeded, name was truncated
  4. 基于 Docker 环境搭建 Zookeeper 集群
  5. 每天一个运维小知识----(持续更新中)
  6. SEO必须知道的55个终极技巧
  7. 于是他打算上计算机课程英语翻译,大学英语3课后翻译
  8. 0x00 开局三层路由起内网【base:路由器+空闲物理主机(我是TP-LINK+台式机)】
  9. 某 SCOI 模拟赛 T1 迫害 DJ(hakugai)【二次剩余 斐波那契循环节】
  10. 【原】Android - could not read ok from ADB Server * failed to start daemon * error: cannot connect to d