华为OD技术面试-最短距离矩阵(动态规划、广度优先)

news2024/12/25 12:37:56

背景

记录2023-10-21 晚华为OD三面的手撕代码题,当时没做出来,给面试官说了我的想法,评价:解法复杂了,只是简单的动态规范 或 广度优先算法,事后找资料记录实现方式。

题目

腐烂的橘子
问题描述:
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
【每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。】
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。【如果不可能,返回 -1。】
示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1 ,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

实现一(广度优先)

求解思路

就按照题目描述,
(1)按照时间 线
(2)逐步 遍历所有的位置
(3)根据规则,如果有坏橘子,且四个正方向(东南西北)有好橘子,则更新之
(4)设计一个状态变量,记录当前时刻:是否有橘子腐败,如果无橘子腐败,是 全部好,还是全部坏,亦或者 好坏相间。

代码实现

testA = [[2,1,1],[1,1,0],[0,1,1]]
testB = [[2,1,1],[0,1,1],[1,0,1]]
testC = [[0,2]]

M_position = testA
print(M_position)

row = len(M_position)
col = len(M_position[0])
set_bad = []

for ir in range(row):
    for jc in range(col):
        if M_position[ir][jc]==1:
            set_bad.append((ir, jc))
print(row, col)

# 一次时间变更
def onetimeupndate():
    # 状态变量 
    # 0 无橘子
    # 1、全部新鲜
    # (1, 2) 好坏 混杂,且未 感染
    # 2、全部坏、
    # 3、坏感染
    flag = 0
    
    # 变更状态的坐标
    changed_set = []
    for ir in range(row):
        for jc in range(col):
            if M_position[ir][jc]==0:
                continue
                
            # 记录唯一状态
            if flag!=3:
                flag = (flag + M_position[ir][jc])/(1 if flag==0 else 2)
            
            # 坏橘子才更新
            if M_position[ir][jc]!=2 or ((ir, jc) in changed_set):
                continue
            
            # 遍历方向
            for i,j in [[1,0],[0,1],[-1,0],[0,-1]]:
                ar_, bc_ = ir + i, jc + j
                
                if ar_<0 or ar_>=row or bc_<0 or bc_>=col:
                    continue
                
                if M_position[ar_][bc_]==1:
                    # 记录更新的坐标
                    changed_set.append((ar_, bc_))
                    # 标记状态
                    flag = 3
                    # 换橘子
                    M_position[ar_][bc_]=2
    return flag

itime = 0
while True:
    flag = onetimeupndate()
    
    print("当前次数",itime)
    print("状态变量",flag)
    print("最新结果",M_position)
    
    if flag!=3:
        if 1<flag<2:
            itime = -1
        break
    itime +=1
    
print("结果",itime)

实现二(动态规范)

求解思路

  1. 问题抽象为 求每个点 到最近的 坏的橘子的 最短距离
  2. 构造初始距离矩阵,约定:

0、坏橘子 inf、永远不坏 row*col、好橘子最大距离

  1. 做两次 扫描,更新最短距离
  2. 得到整体最短距离,找到 永不更新的点

代码实现

def calmintime(M_position):
    
    # 最短路径矩阵
    M_status = []
    
    # 尺寸信息
    row = len(M_position)
    col = len(M_position[0])
    
    MAXTIME = row * col
    
    # 初始矩阵
    for ir in range(row):
        for ic in range(col):
            if ic == 0:
                M_status.append([])
            if M_position[ir][ic] == 2: # 腐烂
                v = 0
            elif M_position[ir][ic] == 0: # 无
                v = inf
            elif M_position[ir][ic] == 1: # 新鲜
                v = MAXTIME # 设为一个到不了的实数最大值
            M_status[ir].append(v)
    
    # 往左下遍历,比较右上两个方向
    for ir in range(row):
        for ic in range(col):
            if M_position[ir][ic]==0:
                continue
            if ic-1>=0:
                if M_status[ir][ic-1]+1<M_status[ir][ic]:
                    M_status[ir][ic] = M_status[ir][ic-1]+1
            if ir-1>=0:
                if M_status[ir-1][ic]+1<M_status[ir][ic]:
                    M_status[ir][ic] = M_status[ir-1][ic]+1

    # 往 右上遍历,比较左下两个方向
    for ir in reversed(range(row)):
        for ic in reversed(range(col)):
            if M_position[ir][ic]==0:
                continue
            if ic+1<col:
                if M_status[ir][ic+1]+1<M_status[ir][ic]:
                    M_status[ir][ic] = M_status[ir][ic+1]+1
            if ir+1<row:
                if M_status[ir+1][ic]+1<M_status[ir][ic]:
                    M_status[ir][ic] = M_status[ir+1][ic]+1
    
    # 最短距离
    vlist = []
    for ir in range(row):
        for ic in range(col):
            v = M_status[ir][ic]
            if not v is inf:
                vlist.append(v)

    if len(vlist)==0:
        return 0

    vmax = max(vlist)
    if vmax==MAXTIME: # 还存在新鲜的橘子
        return -1
    else:
        return vmax

testA = [[2,1,1],[1,1,0],[0,1,1]]
testB = [[2,1,1],[0,1,1],[1,0,1]]
testC = [[0,2]]


结果验证

在这里插入图片描述

参考资料

矩阵(广度优先搜索)(动态规划)

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

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

相关文章

【项目实战】从零开始设计并实现一个接口异常链路分析器

这不是马上要到1024了吗&#xff0c;这不得弄个什么工具给部门项目提提效&#x1f62f;&#xff1f; 1. 背景 在我们服务端应用当中&#xff0c;我们往往会要求更高的性能和更高的稳定性&#xff0c;但实际开发的过程中&#xff0c;可能会出现很多赶时间的情况&#xff08;也…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …

大疆智图(PC):新一代高效率高精度摄影测量软件

大疆智图是一款以二维正射影像与三维模型重建为主的软件&#xff0c;同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化&#xff0c;实时生成高精度、高质量三维模型&#xff0c;满足事故现场、工程监测、电力巡线等场景的展示与精…

42914-2023 铝合金产品断裂韧度试验方法

1 范围 本文件描述了铝合金产品断裂韧度的试验方法。 本文件适用于铝合金轧制板材、挤压棒材、挤压板材、挤压管材、挤压型材和锻件产品的平面应变断 裂韧度和平面应力断裂韧度的测定。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款…

Bootstrap的卡片组件相关知识

Bootstrap的卡片组件 01-卡片介绍及常用场合 Bootstrap的卡片组件&#xff08;Card&#xff09;是一种常用的UI元素&#xff0c;或者也可称为一种常用的结构&#xff0c;用于呈现信息和内容&#xff0c;通常在网页和应用程序中用于以下情况&#xff1a; 博客文章和新闻文章&a…

Linux自有服务与软件包管理

服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" 举例&#xff1a;当我们使…

经管博士科研基础【27】如何判断正定矩阵或者负定矩阵?

在【26】一章中,我们学习到可以通过判断海塞矩阵是正定矩阵或负定矩阵来判断函数的极值问题,为此,我们今天就回顾一下怎么判断海塞矩阵或者说任意一个矩阵是一个正定矩阵或者负定矩阵。 一、正定矩阵的定义 其实,我们可以看到上面的任意非零向量x可以更换为“单位向量”。…

多继承的实例介绍

一、多继承同名覆盖 子类中的成员与父类中的成员同名问题&#xff0c;通过作用域分辨符&#xff08;&#xff1a;&#xff1a;&#xff09;进行限定类的访问&#xff0c;从而实现对不同类中的同名成员各自赋值。 #include<iostream> using namespace std; class A{//父…

一起学数据结构(10)——排序

从本文开始&#xff0c;通过若干篇文章展开对于数据结构中——排序的介绍。 1. 排序的概念&#xff1a; 将一堆杂乱无章的数据&#xff0c;通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序&#xff08;由小到大或者由大到小&#xff09;的运算。 在数据的排序中…

小微企业需要认定吗?怎么认定?

小微企业在方便人民群众生活&#xff0c;解决就业&#xff0c;活跃市场经济方面发挥了巨大作用。我国对小微企业也有相应的划分标准和税收优惠政策&#xff0c;那么小微企业需要认定吗&#xff1f;认定小微企业需要哪些资料&#xff1f;下面玖邀开业小编给大家做一个简单说明。…

BUUCTF N种方法解决 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一个.exe文件 密文&#xff1a; 解题思路&#xff1a; 1、双击.exe文件&#xff0c;出现一个错误&#xff0c;切换其他的方法。 2、将KEY.exe文件放到010 Editor&#xff0c;分析这个…

Delphi : 在 SDK 管理器中添加其他 iOS 框架

在用Delphi开发IOS程序时&#xff0c;有时候需要添加其他的iOS框架&#xff0c;也就是说在默认的SDK中没有包含的iOS框架&#xff08;frameworks&#xff09;。 如果您希望利用 Delphi 提供支持之外的 iOS 框架&#xff0c;则需要在 SDK 管理器中添加框架的路径。 为此&#…

使用Python打造微信高效自动化操作教程

引言 在如今数字化时代&#xff0c;人们对于效率的追求越来越强烈&#xff0c;尤其是在工作和学习中。自动化操作成为了提高生产力的有效途径之一&#xff0c;而PyAutoGUI和Pyperclip作为Python中的两个强大库&#xff0c;为我们实现自动化操作提供了便利。本文将向大家介绍如…

抖音热搜榜:探索热门话题的奥秘

抖音热搜榜是抖音平台根据用户观看、点赞、评论、分享等行为数据&#xff0c;综合计算得出的热门话题排行榜。它反映了当前平台上最热门、最受欢迎的话题和内容。抖音热搜榜有以下几个作用和意义&#xff1a; 1. 满足用户需求&#xff1a;抖音热搜榜为用户提供了丰富的热门话题…

前端如何直接上传文件夹

前面写了一篇仿写el-upload组件&#xff0c;彻底搞懂文件上传&#xff0c;实现了选择/拖拽文件上传&#xff0c;我们经常看到一些网站支持直接选择整个文件夹上传&#xff0c;例如&#xff1a;宝塔面板、cloudflare托管、对象存储网站等等需要模拟文件路径存储文件的场景。那是…

每日刷题|贪心算法初识

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 推荐专栏&#xff1a;每日刷题 ♈️今日夜电波&#xff1a;悬溺—葛东琪 0:34 ━━━━━━️&#x1f49f;──────── 3:17 &#x1f…

递福巴士是不是骗局呢?

递福巴士的背景介绍 递福巴士是社区服务机构软件。递福巴士是一家提供公益服务的平台&#xff0c;为社区居民提供各种服务和支持的软件。多年来&#xff0c;递福巴士一直致力于社区服务和社会公益&#xff0c;积极推动社区的发展&#xff0c;改善社区居民的生活质量。 递福巴士…

震坤行、西域和京东工业三大工业电商平台API接口详解和说明

一、震坤行 震坤行是中国领先的B2B电子商务平台之一&#xff0c;主要面向全国的制造商、供应商和采购商&#xff0c;提供物流、供应链等。万邦科技联手震坤行&#xff0c;全面拓展电商业务。电商数据API接口平台新增震坤行接口&#xff0c;可帮助客户轻松查询震坤行网站上的商…

Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】

2023每日刷题&#xff08;六&#xff09; Leetcode—34.在排序数组中查找元素的第一个和最后一个位置 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int lower_bound(int *arr, int numsSize, int target) {// 左闭右开区间[lef…

Windows 下载编译chromium源码

前言 本文介绍如何下载并编译chromium源码。相关前置条件可参考官方文档。 环境 &#xff1a; Windows 11VS 2022 环境设置 打开cmd&#xff0c;设置代理 set http_proxyhttp://127.0.0.1:7890 & set https_proxyhttp://127.0.0.1:7890注意&#xff1a;使用cmd命令行…