小华最多能得到多少克黄金 - 华为OD统一考试(C卷)

news2024/11/15 19:32:34

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

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

横坐标和纵坐标数位之和不大于 k 的方格中存在黄金 (每个方格中仅存在一克黄金),但横坐标和纵坐标数位之和大于 k 的方格存在危险不可进入。

小华从入口( 0 , 0 )进入,任何时候只能向左,右,上,下个方向移动一格。请问小华最多能获得多少克黄金?

输入描述

坐标取值范围如下:

0 ≤m≤ 50

0 ≤n≤ 50

k 的取值范围如下

0 ≤k≤ 100

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

输出描述

最多能获得多少克黄金

示例1

输入:
40 40 18

输出:
1484

说明:

示例2

输入:
4 5 7

输出:
20

说明:
如图每个单元格中的数位之和不大于 
7
7,都是符合要求的,所以可以最多可获得 
20
20 克黄金

image-20240305163737068

题解

这道题目是一个搜索问题,需要从入口 (0, 0) 开始,使用深度优先搜索(DFS)来遍历满足数位之和条件的方格。在搜索的过程中,需要判断坐标的有效性和数位之和是否满足条件。同时,使用一个二维数组 vis 来记录已经访问过的方格,避免重复访问。

具体步骤如下:

  1. 定义一个函数 sum_of_digits 用于计算一个数字的数位之和。
  2. 定义 DFS 函数,接收当前坐标 (r, c),在函数中进行如下判断:
    • 验证坐标有效性:rc 不越界,且当前方格未被访问。
    • 计算数位之和,如果数位之和大于 k,则不再递归下去。
  3. 在 DFS 函数中标记当前方格为已访问,并增加黄金数量。
  4. 递归调用 DFS 函数,分别向上、向下、向左、向右四个方向进行搜索。
  5. 主函数中读入 mnk 的值,初始化 gold 为 0,并创建一个二维数组 vis 用于记录访问状态。
  6. 调用 DFS 函数开始搜索,从入口 (0, 0) 开始。
  7. 输出最终的黄金数量。

复杂度分析

时间复杂度:在最坏情况下,每个方格可能都需要访问一次,因此时间复杂度为 O(m * n)。

空间复杂度:使用了一个二维数组 vis 来记录访问状态,因此空间复杂度为 O(m * n)。同时,递归调用的栈空间也需要考虑,但在这里由于递归深度不会很大,可以近似为 O(1)。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    static int gold;
    static int m, n, k;
    static boolean[][] vis;

    // 求数位之和
    static int sumOfDigits(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }

    static void dfs(int r, int c) {
        // 验证坐标有效性
        if (r < 0 || c < 0 || r >= m || c >= n || vis[r][c]) return;

        // 求数位之和,如果数位之和大于 k,则不再递归下去了
        if (sumOfDigits(r) + sumOfDigits(c) > k) return;
        vis[r][c] = true;
        gold++;

        // 递归调用
        dfs(r - 1, c);
        dfs(r + 1, c);
        dfs(r, c - 1);
        dfs(r, c + 1);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        m = scanner.nextInt();
        n = scanner.nextInt();
        k = scanner.nextInt();

        // 初始化
        gold = 0;
        vis = new boolean[m][n];

        dfs(0, 0);

        System.out.println(gold);
    }
}

Python

def sum_of_digits(num):
    # 求数位之和
    return sum([int(c) for c in str(num)])

def dfs(r, c):
    global gold, m, n, k, vis
    # 验证坐标有效性
    if r < 0 or c < 0 or r >= m or c >= n or vis[r][c]:
        return

    # 求数位之和,如果数位之和大于 k,则不再递归下去了
    if sum_of_digits(r) + sum_of_digits(c) > k:
        return
    vis[r][c] = True
    gold += 1

    # 递归调用
    dfs(r - 1, c)
    dfs(r + 1, c)
    dfs(r, c - 1)
    dfs(r, c + 1)

# 主函数
m, n, k = map(int, input().split())

# 初始化
gold = 0
vis = [[False] * n for _ in range(m)]

dfs(0, 0)

print(gold)

C++

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

int  gold;
int  m, n, k;
bool vis[55][55];

// 求数位之和
int sum_of_digits(int num)
{
    int sum = 0;
    while (num) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

void dfs(int r, int c)
{
    // 验证坐标有效性
    if (r < 0 || c < 0 || r >= m || c >= n || vis[r][c]) return;

    // 求数位之和,如果数位之和大于k,则不再递归下去了
    if (sum_of_digits(r) + sum_of_digits(c) > k) return;
    vis[r][c] = true;
    gold++;

    // 递归调用
    dfs(r - 1, c);
    dfs(r + 1, c);
    dfs(r, c - 1);
    dfs(r, c + 1);
}

int main()
{
    cin >> m >> n >> k;

    // 初始化
    gold = 0;
    memset(vis, 0, sizeof(vis));

    dfs(0, 0);

    cout << gold << endl;

    return 0;
}
    

相关练习题

题号题目难易
LeetCode 547547. 省份数量中等
LeetCode 200200. 岛屿数量中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解现货黄金的技术分析技巧

在金融市场&#xff0c;特别是现货黄金交易领域中&#xff0c;投资者和交易者都致力于寻找那些可以带来盈利的秘诀与策略。黄金作为一种避险资产&#xff0c;其价格受到众多因素的影响&#xff0c;包括全球经济状况、货币政策、市场需求等。因此&#xff0c;掌握现货黄金的技术…

如何分辨Mac设备X86或ARM

在终端中输入如下命令可以获取到当前 Mac 设备是 X86 还是 ARM 类型 uname -a 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

ModuleNotFoundError:如何解决 no module named Python 错误?

1.问题描述 下面的python执行时&#xff1a; import chinese_calendar import datetime def is_holiday(year, month, day):return chinese_calendar.is_holiday(year, month, day) # 判断2023年2月14日是否为节假日 print(is_holiday(2023, 2, 14)) # 输出: False报错如下&a…

AI从截图直接生成代码、前端程序员的福音

简介 项目可以将任何屏幕截图或设计转换为干净的代码&#xff08;支持大多数框架&#xff09;。来自领先公司的开发人员和设计师使用的排名第一的工具。完全开源&#xff0c;在 GitHub 上拥有超过 35,000 颗星。非常受欢迎。 各位小伙伴们感觉有帮助的&#xff0c;可以收藏一…

Docker中使用nginx-rtmp推拉网络摄像头视频流

前言&#xff1a; 该部分比较麻烦&#xff0c;闹腾了好久&#xff08;ffmpeg推拉流没学过&#xff0c;事实证明依葫芦画瓢是不行滴&#xff0c;后面有时间再学吧&#xff09;&#xff0c;后来借助chatGPT勉强解决&#xff0c;但不是很懂。因个人能力有限&#xff0c;只复述操作…

前端部署真的不简单

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~> 原文&#xff1a;前端部署真的不简单 - 掘金 (juejin.cn) 现在大部分的中小型公司部署前端代码都是比较简单的&#xff0c;主要步骤如下: 首先&#xff0c;通过脚手架提供的命令npm run build打包前端代码&…

外汇天眼:蓝莓市场终止所有MT4/MT5专业公司业务

总部位于澳大利亚的零售外汇和差价合约经纪商蓝莓市场宣布&#xff0c;已终止其数据和平台服务产品&#xff0c;该产品旨在通过利用其基础设施为专业公司行业提供服务。 蓝莓市场表示&#xff0c;已经对其数据和平台服务产品“落下帷幕”&#xff0c;与所有专业交易公司包括MyF…

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了&#xff0c;还有很多小伙伴不会开通&#xff0c;其实开通很简单&#xff0c;环境需要自己搞定&#xff0c;升级的话就需要一张visa卡&#xff0c;办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…

html邮件基本使用方法?如何发送HTML邮件?

html邮件是什么意思&#xff1f;如何在HTML中创建电子邮件链接&#xff1f; HTML邮件以其丰富的格式和视觉效果&#xff0c;让我们的邮件内容更加生动和吸引人。那么&#xff0c;HTML邮件的基本使用方法是什么呢&#xff1f;我们又该如何发送HTML邮件呢&#xff1f;下面&#…

Linux之HTTP协议

目录 一、HTTP协议 1.1 HTTP概念 1.2 HTTP协议的格式 1.3 URL 1.4 HTTP的请求方法 1.5 HTTP的状态码 1.6 HTTP报头 1.7 长链接与短链接 1.8 Cookie与Session 1.8.1 Cookie的概念 1.8.2 Cookie的应用场景 1.8.3 Session的概念 一、HTTP协议 1.1 HTTP概念 HTTP&…

使用Javassist 在android运行时生成类

序言 最近在写框架&#xff0c;有一个需求就是动态的生成一个类&#xff0c;然后查阅了相关文献&#xff0c;发现在android中动态生成一个类还挺麻烦。因次把一些内容分享出来&#xff0c;帮助大家少走弯路。 方案一 DexMaker DexMaker 是一个针对 Android 平台的库&#xf…

Java动态转发代理IP的实现方法

目录 前言 一、代理IP池的管理 二、代理IP的请求转发 总结 前言 在某些情况下&#xff0c;我们可能需要在Java应用程序中使用代理IP来进行网络请求。而有时候&#xff0c;我们希望能够动态地切换代理IP&#xff0c;以增加请求的成功率和效果。本文将介绍如何在Java中实现动…

【深度学习笔记】5_8 网络中的网络NiN

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的…

深度学习_16_权重衰退调整过拟合

所谓过拟合即模型复杂度较高&#xff0c;但用于训练数据集过于简单&#xff0c;最后导致模型将过多无用渣质作为学习对象 这个在上篇 深度学习_15_过拟合&欠拟合 已经详细介绍&#xff0c;以下便不再赘述。 上篇提到要想解决过拟合现象可以试着降低模型复杂度&#xff0c…

边缘计算网关在机床生产中的应用-天拓四方

随着工业4.0的推进&#xff0c;物联网&#xff08;IoT&#xff09;技术在各个工业领域中的应用日益广泛。特别是在机床行业&#xff0c;物联网技术的引入不仅提高了生产效率&#xff0c;还实现了对机床设备的实时监控和远程维护。在这一背景下&#xff0c;边缘计算网关的角色愈…

牛客网 计算某个字符出现的次数

在本题中&#xff0c;我们是要统计一个字符串中重复字母出现的次数&#xff0c;我们把输入的字母转换成小写&#xff0c;然后把字符串也都转换成小写&#xff0c;然后把字符串中包含字母的地方替换成空。然后直接用字符串减去替换完成的字符串&#xff0c;就是我们要统计的个数…

c++ opecv项目实战

1、银行卡识别项目 参考文章 操作流程&#xff1a; 1、提取模板的每个数字 读取图片->转换为灰度图像->二值化图像(大于10取0&#xff0c;小于取255)->轮廓检测->绘制轮廓->对所有轮廓进行排序->提取模板所有轮廓每个数字 2、读取信用卡->转换为灰度图像…

unity Game视图看不到贴花,但是在Scene视图能看到

解决方法&#xff1a;找到URP的配置文件 &#xff0c;修改Quality–RederScale为1&#xff0c;就可以了&#xff0c;这是unity 的bug&#xff0c;2022版本以后就没有这个问题了

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

ROS读书记录1:机器人SLAM导航核心技术与实战1

机器人SLAM导航核心技术与实战1 第一章第2章 ROS简介 视频参考&#xff1a; 《机器人SLAM导航核心技术与实战》书籍配套教学视频 第一章 第2章 ROS简介 ROS:机器人开发平台 ①ROS是一个分布式通信框架(最核心的本质 ②ROS是一个开发工具的集台 ③ROS是一系列开源软件包 计算…