中庸行者 - 华为机试真题题解

alt

给定一个m * n的整数矩阵作为地图,短阵数值为地形高度;
中庸行者选择地图中的任意一点作为起点,尝试往上、下、左、右四个相邻格子移动;
移动时有如下约束:

  • 中庸行者只能上坡或者下坡,不能走到高度相同的点
  • 不允许连续上坡或者连续下坡,需要交替进行,
  • 每个位置只能经过一次,不能重复行走,

请给出中庸行者在本地图内,能连续移动的最大次数。

输入

一个只包含整数的二维数组:

3 3
4 7 8
8 6 6
2 6 4

第一行两个数字,分别为行数和每行的列数;
后续数据为矩阵地图内容:
矩阵边长范围:[1, 8];
地形高度范围:[0, 100000];

输出

一个整数,代表中庸行者在本地图内,能连续移动的最大次数。

示例1

输入:
2 2
1 2
4 3

输出:
3

解释: 3 > 4 > 1 > 2

示例2

输入:
3 3
1 2 4
3 5 7
6 8 9

输出:
4

解释: 6 > 3 > 5 > 2 > 4

Java 题解

回溯

遍历每个位置做为起点进行回溯探索最大次数

import java.util.Scanner;

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

        int[][] grid = new int[m][n];
        for (int r = 0; r < m; r++) {
            for (int c = 0; c < n; c++) {
                grid[r][c] = scanner.nextInt();
            }
        }

        Solution solution = new Solution();
        System.out.println(solution.solve(grid));

    }
}

class Solution {
    int max;

    public int solve(int[][] g) {
        this.max = 0;
        int m = g.length, n = g[0].length;
        boolean[][] vis = new boolean[m][n];
        // 从每个位置作为起点尝试获取最大的移动步数
        for (int r = 0; r < m; r++) {
            for (int c = 0; c < n; c++) {
                dfs(g, vis, r, c, 0, true);
                dfs(g, vis, r, c, 0, false);
            }
        }

        return this.max;
    }

    /**
     *
     * @param g 矩阵地图
     * @param vis 访问状态
     * @param r 当前所在位置行
     * @param c 当前所在位置列
     * @param times 已经移动的次数
     * @param up 是否走上坡到达当前位置
     */
    private void dfs(int[][] g, boolean[][] vis, int r, int c, int times, boolean up) {
        this.max = Math.max(max, times);
        int M = g.length, N = g[0].length;
		
        vis[r][c] = true;
        int[] dirs = new int[]{-1, 0, 1, 0, -1};
        for (int k = 1; k < 5; k++) {
            int nr = r + dirs[k - 1], nc = c + dirs[k];
            if (nr < 0 || nc < 0 || nr >= M || nc >= N || vis[nr][nc] || g[nr][nc] == g[r][c]) {
                continue;
            }

            if (up && g[nr][nc] > g[r][c]) continue;
            if (!up && g[nr][nc] < g[r][c]) continue;

            dfs(g, vis, nr, nc, times + 1, !up);
        }
        vis[r][c] = false;
    }
}

Python 题解

from itertools import pairwise

m, n = map(int, input().split())
g = [list(map(int, input().split())) for _ in range(m)]

max_step = 0
vis = [[False] * n for _ in range(m)]

def dfs(r, c, step, up):
    global max_step, m, n
    vis[r][c] = True
    dirs = (-1, 0, 1, 0, -1)
    max_step = max(max_step, step)
    # print(f"({r}, {c}) step: {step}  up: {up}")
    for dr, dc in pairwise(dirs):
        nr, nc = r + dr, c + dc
        if 0 <= nr < m and 0 <= nc < n and not vis[nr][nc] and g[nr][nc] != g[r][c]:
            if up and g[nr][nc] > g[r][c]: continue
            if not up and g[nr][nc] < g[r][c]: continue
            dfs(nr, nc, step + 1, not up)
    vis[r][c] = False

for r in range(m):
    for c in range(n):
        dfs(r, c, 0, True)
        dfs(r, c, 0, False)

print(max_step)

C++ 题解

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int max_step;

/**
*
* @param g 矩阵地图
* @param vis 访问状态
* @param r 当前所在位置行
* @param c 当前所在位置列
* @param times 已经移动的次数
* @param up 是否走上坡到达当前位置
*/
void dfs(vector<vector<int>>& g, vector<vector<bool>>& vis, int r, int c, int times, bool up) {
    max_step = max(max_step, times);
    int M = g.size(), N = g[0].size();
    vis[r][c] = true;
    vector<int> dirs = {-1, 0, 1, 0, -1};
    for (int k = 1; k < 5; k++) {
        int nr = r + dirs[k - 1], nc = c + dirs[k];
        if (nr < 0 || nc < 0 || nr >= M || nc >= N || vis[nr][nc] || g[nr][nc] == g[r][c]) {
            continue;
        }

        if (up && g[nr][nc] > g[r][c])
            continue;


        if (!up && g[nr][nc] < g[r][c])
            continue;


        dfs(g, vis, nr, nc, times + 1, !up);

    }
    vis[r][c] = false;
}

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

    vector<vector<int>> grid(m, vector<int>(n));
    for (int r = 0; r < m; r++) {
        for (int c = 0; c < n; c++) {
            cin >> grid[r][c];
        }
    }


    vector<vector<bool>> vis(m, vector<bool>(n, false));

    // 从每个位置作为起点尝试获取最大的移动步数
    for (int r = 0; r < m; r++) {
        for (int c = 0; c < n; c++) {
            dfs(grid, vis, r, c, 0, true);
            dfs(grid, vis, r, c, 0, false);
        }
    }

    cout << max_step << endl;

    return 0;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpectralGPT: Spectral Foundation Model 论文翻译3

遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址&#xff1a;[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) E.消融研究 在预训练阶段&#xff0c;我们对可能影响下游任务表现的各种因素进行了全面研究。这些因素包括掩蔽比、ViT patch大小、数据规…

matplotlib学习

显示两个figure 坐标上刻度修改 plt.xlim() 下标范围 plt.xticks() 替换新的下标 图例显示 散点图 subplot多合一显示

LDAP协议和AD活动目录的讲解

目录 LDAP协议 LDAP基本概念 LDAP目录的数据结构 LDAP交互过程以及相关报文 AD&#xff08;Active Directory&#xff09; AD基本概念 AD域与工作组、本地组的区别 AD DS&#xff08;AD域服务&#xff09; 信任关系 组策略和安全组 LDAP协议 LDAP基本概念 LDAP&…

2023年【高压电工】考试报名及高压电工试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新高压电工试题及解析题目及答案&#xff01;多做几遍&#xff0c;其实通过高压电工理论考试很简单。 1、【单选题】 12m电杆埋设深度宜()。&…

每天一点python——day88

#每天一点Python——88 #编程两大思想【面向过程与面向对象】 #如图&#xff1a; 面向过程的线性思维&#xff1a; 类似于做菜一步步的来&#xff0c;先怎么样怎么样&#xff0c;再怎么样 如果不一步步的来&#xff0c;例如先炒菜再点火&#xff0c;这样是做不好的 面向对象&a…

MySQL系列(一):索引篇

为什么是B树&#xff1f; 我们推导下&#xff0c;首先看下用哈希表做索引&#xff0c;是否可以满足需求。如果我们用哈希建了索引&#xff0c;那么对于如下这种SQL&#xff0c;通过哈希&#xff0c;可以快速检索出数据&#xff1a; select * from t_user_info where id1;但是这…

十年前端之离别的旋律

在一家名叫“梦想家”的小公司里&#xff0c;有一个普通的程序员&#xff0c;他的名字叫做小帅。每天默默地坐在角落里&#xff0c;默默地写着代码&#xff0c;默默地为公司付出。他的眼睛里总是充满了对工作的热爱和对生活的热情&#xff0c;但他的内心却隐藏着一个秘密&#…

R语言学习

Part1阶段1&#xff1a;入门基础 1安装R和RStudio&#xff1a; 下载并安装R&#xff1a;https://cran.r-project.org/ 下载并安装RStudio&#xff1a;https://www.rstudio.com/products/rstudio/download/ 2Hello World&#xff1a; 学习如何在R中输出"Hello, World!"…

Vue2、Vue3的Diff算法比较

前言 diff算法是vue更新dom前&#xff0c;比较新旧vdom的一种优化方式 特点&#xff1a; 只会在同一级比较 从两边往中间收拢 差别 vue2 和 vue3的差别在于处理完头尾节点后&#xff0c;对设于节点的处理方式vue2 是遍历旧节点&#xff0c;将旧节点映射到map里&#xff0…

npm : 无法加载文件 D:\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。

今天在使用vscode下载项目的依赖时&#xff0c;输入 pnmp install,结果报错: npm : 无法加载文件 D:\nodejs\node_global\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。原因&#xff1a; 因为在此系统上禁止运行脚本&#xff0c;也就是说没有权限&#xff0c;查一下&#…

每天一点python——day87

#每天一点Python——87 #Pycharm程序调试 #例&#xff1a;【我想输出1-10】 i1 while i<10:print(i) #会一直输出1{我想输出一到十&#xff0c;但是他一直输出1}【如果想找到问题出现在什么地方&#xff1a;就需要一步步调试】 #那么怎么调试呢 #前面声明是没有错的&#x…

Java——面试:异常处理所用到的关键字有哪些?具体有什么作用?

1.异常处理所用到的关键字有哪些&#xff1f; Java异常处理所使用的到的关键字有&#xff1a;try、catch、finally、throw、throws五个 2.具体有什么作用&#xff1f; try&#xff1a;用于捕获异常&#xff0c;后面必须跟一个或多个catch块或者一个finally块&#xff1b;捕获到…

AdaBoost 详解

AdaBoost Boosting Boosting 是指&#xff0c;仅通过训练精度比随机猜想&#xff08;50%&#xff09;稍高的学习器&#xff0c;通过集成的方式过建出强学习器。 其中boosting中最有名的是AdaBoost算法。AdaBoost是英文"Adaptive Boosting"&#xff08;自适应增强&…

祸害了人民3年的新冠消失了,但有些奇怪现象,让人百思不得其解

真是没想到啊&#xff0c;祸害我们3年的新冠病毒突然就消失了&#xff0c;但是紧接着呢&#xff0c;却有一个非常奇怪的现象出现了&#xff0c;真的是令人百思不得其解&#xff01; 新冠病毒&#xff0c;于2020年的开始&#xff0c;可以说根本就没有任何缓冲期&#xff0c;一开…

微信小程序基础bug

1.苹果11手机小程序请求数据不显示 设置-》隐私-》分析与改进-》开启 ”与开发者共享“ 2.<navigator>组件回退delta不成功 tabBar 页面是不能实现后退的效果的. 因为, 当我们跳转到 tabBar 页面&#xff0c;会关闭其他所有非tabBar 页面,所以当处于 tabBar 页面时, 无…

redhat修改root密码

系统环境 redhat版本redhat7.6 1.在当前界面按e键进入进行编辑 2.在rhgb quite 后面加入 rd.break&#xff0c;按住ctrlx使用更改的参数引导系统 3. 挂载文件系统 3.1 进入此界面后挂载文件 mount -o remount,rw /sysroot4. 更改系统文件的root chroot /sysroot5. 修改密码…

IDEA Maven 配置国内源

基本步骤 分别设置下图的两个&#xff0c;一个是对当前项目的设置&#xff0c;一个是对以后创建的项目设置&#xff0c;这样以后就不用重新配置了。 将下面的两个勾选上 注意&#xff0c;两个地方&#xff0c;Settings 和 Settings for New Projects 的勾都要勾上。 前往 User…

【技术分享】ORACLE数据库相关操作

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502[欢迎关注微信公众号&#xff1a;厦门微思网络] -- 截断表 TRUNCATE TABLE TABLE_NAME; -- …

排序:直接插入排序希尔排序

目录 排序&#xff1a; 概念&#xff1a; 直接插入排序&#xff1a; 代码的实现&#xff1a; 代码解析&#xff1a; 总结&#xff1a; 希尔排序&#xff1a; 代码实现&#xff1a; 预排序&#xff1a; 代码优化&#xff1a; gap 的 本质 &#xff1a; 直接…

电子版简历模板精选5篇

电子版简历模板模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;做好简历&#xff0c;来幻主简历。 电子版简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;ERP咨询顾问 意向城市&#xff1a;北京市 薪资要求&#xff1a;…