【独家OD2023C卷真题】20天拿下华为OD笔试【DFS/BFS】2023C

您所在的位置:网站首页 黄金买卖数量最多多少克 【独家OD2023C卷真题】20天拿下华为OD笔试【DFS/BFS】2023C

【独家OD2023C卷真题】20天拿下华为OD笔试【DFS/BFS】2023C

2024-07-17 12:03| 来源: 网络整理| 查看: 265

题目描述与示例 题目描述

小华按照地图去寻宝,地图上被划分成 n n n 行和 m m m 列的方格,横纵坐标范围分别是 [ 0 , n − 1 ] [0, n-1] [0,n−1] 和 [ 0 , m − 1 ] [0, m-1] [0,m−1]。

在横坐标和纵坐标的数位之和不大于 k k k 的方格中存在黄金(每个方格中仅存在一克黄金),但横坐标和纵坐标数位之和大于 k k k 的方格存在危险不可进入。小华从入口 ( 0 , 0 ) (0,0) (0,0) 进入,任何时候只能向左,右,上,下四个方向移动一格。

请问小华最多能获得多少克黄金?

输入描述

坐标取值范围如下:

0 ≤ m ≤ 5 0 ≤ m ≤ 5 0≤m≤5

0 ≤ n ≤ 5 0 ≤ n ≤ 5 0≤n≤5

k k k 的取值范围如下:

0 ≤ k ≤ 10 0 ≤ k ≤ 10 0≤k≤10

输入中包含 3 个字数,分别是 m, n, k

输出描述

输出小华最多能获得多少克黄金

示例一 输入 40 40 18 输出 1484 示例二 输入 5 4 7 输出 20 解题思路 计算数位和

本题的重点在于理解数位和的概念。

所谓数位和,指的是一个正整数的各个位的和。比如11的数位和是1+1 = 2

对于任意一个正整数n,其数位和可以通过以下两种方式任选其一进行计算。在效率上,数学方法略优于字符串方法,但因为数据量不大,所以都可以使用。

数学方法 def cal_digit_sum(n): ans = 0 while n != 0: ans += n % 10 n //= 10 return ans 字符串方法 def cal_digit_sum(n): return sum(int(i) for i in str(n)) 构建数位和矩阵

在拿到地图的大小n*m之后,就可以通过双重循环遍历的方式,构建出每一个位置的数位和矩阵grid。

grid = [[0] * m for _ in range(n)] for i in range(n): for j in range(m): grid[i][j] = cal_digit_sum(i) + cal_digit_sum(j) 从起点开始进行搜索

拿到数位和矩阵grid之后,由于小华从起点出发上下左右均可以移动,所以问题就转化为了从起点(0, 0)开始进行图的索能够到达多大面积的地图。

这个问题用DFS或者BFS都可以完成。直接套模板即可。

代码 解法一:DFS python # 题目:【DFS/BFS】2023C-地图寻宝 # 分值:200 # 作者:许老师-闭着眼睛学数理化 # 算法:DFS # 代码看不懂的地方,请直接在群上提问 import sys # 地图最大范围为50*50 = 2500,超过了最大递归深度的默认值1000 # 设置最大递归深度 sys.setrecursionlimit(100000) # 表示四个方向的数组 DIRECTIONS = [(0,1), (1,0), (-1,0), (0,-1)] # 构建非负整数n的数位和的函数 def cal_digit_sum(n): ans = 0 while n != 0: ans += n % 10 n //= 10 return ans def dfs(i, j, m, n, k, checklist, grid): global ans checklist[i][j] = 1 ans += 1 for di, dj in DIRECTIONS: ni, nj = i+di, j+dj # 注意此处的判断条件为grid[ni][nj]


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3