图文解答之最短路径||

news2024/9/21 12:38:35

最短路径||
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
例子:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

解题思路:
如果格子上有障碍,那么我们不考虑包含这个格子的任何路径。我们从左至右、从上至下的遍历整个数组,那么在到达某个顶点之前我们就已经获得了到达前驱节点的方案数,这就变成了一个动态规划问题。我们只需要一个 Grid 数组来存储到达格点的方案数。

算法步骤:

  1. 状态:既每个格点到达的方案数,存在grid二维数组中,状态初始化:机器人只可以向下和向右移动,因此第一行的格子只能从左边的格子移动到,第一列的格子只能从上方的格子移动到。所以他们根据情况是1或者0.
  2. 决策:除了初始化的第一行和第一列,余下每个格点都是grid[i][j]=grid[i-1][j]+grid[i][j-1]
  3. 阶段:由于机器人只可以向下和向右移动,要求的grid[i][j]格,必先知道上边和左边一格的方案数,所有我们从左到右,从上到下计算。
    数据分析:
    Int grid[N][N]:保存每个格点方案数。
    图解过程:
    过程图解
    复杂度分析:
    时间复杂度:O(N^M)
    空间复杂度:O(N^M)
#include <stdio.h>
int uniquePathsWithObstacles(int obstacleGrid[][20], int obstacleGridSize, int obstacleGridColSize){
    if (obstacleGridSize == 0 || obstacleGridColSize == 0)
    {
        return 0;
    }
    int m = obstacleGridSize;
    int n = obstacleGridColSize;
    unsigned int dq[m][n];  // 用int的话,测试用例会超范围
    int i;
    int j;

    // 如果起始位置就是1,则直接返回0
    if (obstacleGrid[0][0] == 1)
    {
        return 0;
    }

    // 将初始位置置为1
    dq[0][0] = 1;
    // 处理第一列,遇到过障碍物之后,后面的都无法到达,因此都是0
    for (i = 1; i < m; i++) {
        if (obstacleGrid[i][0] == 1 || dq[i - 1][0] == 0) {
            dq[i][0] = 0;
        } else {
            dq[i][0] = 1;
        }
    }

    // 处理第一行,遇到过障碍物之后,后面的都无法到达,因此都是0
    for (j = 1; j < n; j++) {
        if (obstacleGrid[0][j] == 1 || dq[0][j - 1] == 0) {
            dq[0][j] = 0;
        } else {
            dq[0][j] = 1;
        }
    }

    for (i = 1; i < m; i++) {
        for (j = 1; j < n; j++) {
            if (obstacleGrid[i][j]) {  // 如果当前的是障碍物,则这个地方无法到达,因此这个位置置为0
                dq[i][j] = 0;
            } else {
                dq[i][j] = dq[i - 1][j] + dq[i][j - 1]; // 到达这个位置可以由上面和左边两条路径到达,是到达上面和左边位置的路径之和
            }
        }
    }
    return dq[m - 1][n - 1];  // 返回到达目的地的路径之和
}

int main(){
	int a[20][20]={};
	int n,m;
	printf("输入行数,列数\n");
	 scanf("%d %d",&m,&n);
	printf("输入表格\n");	 
	for(int i=0;i<m;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); 
	printf("%d",uniquePathsWithObstacles(a, m, n));
}

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

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

相关文章

rust过程宏 proc-macro-workshop解题-0-介绍

名字版本号rust1.69.0OSubuntu22.04proc-macro-workshop是一个学习rust过程宏非常好的工程。里边包含五大类题目。并且每种题目都有实际价值,可以应用在企业级项目中。我们在这里先介绍一下这个项目如何运行如何测试,如何验证过程宏的正确性以及如何调试。 本文只围绕以下几个…

2月编程语言排行榜出炉,第一名势头强劲

近日&#xff0c;TIOBE公布了2023年2月编程语言排行榜&#xff0c;本月各个语言表现如何&#xff1f;谁又摘得桂冠&#xff1f; TIOBE 2月Top15编程语言&#xff1a; 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴们都知道&#xff0c;编程…

Linux入门篇(一)

Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候&#xff0c;经常碰到Linux的知识。同时&#xff0c;大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…

docker-入门到精通

docker知识总结 参考文档 https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/–volumes-from.html 1、什么是docker ​ 容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式&#xff0c;容器技术可以在按需构建操作系统实例…

vue3 Proxy响应式原理分析(面试题)

在开始正文前&#xff0c;先理一下vue2 Object.defineProperty 和 vue 3 Proxy 区别&#xff1a; Object.defineProperty&#xff1a;数据劫持 Proxy&#xff1a;数据代理 注意&#xff1a; 响应式原理和双向数据绑定原理是两回事&#xff0c;一般面试官会先问响应式原理再问双…

内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ShardingSphere-Proxy 数据库协议交互解读

数据库协议对于大部分开发者来说算是比较冷门的知识&#xff0c;一般的用户、开发者都是通过现成的数据库客户端、驱动使用数据库&#xff0c;不会直接操作数据库协议。不过&#xff0c;对数据库协议的特点与流程有一些基本的了解&#xff0c;有助于开发者在排查数据库功能、性…

Fabric磁盘扩容后数据迁移

线上环境原来的磁盘比较小&#xff0c;随着业务数据的增多&#xff0c;磁盘需要扩容&#xff0c;因此需要把原来docker数据转移至新的数据盘。 数据迁移 操作系统&#xff1a; centOS 7   docker默认的数据目录为/var/lib/docker   创建一个新的目录/opt/dockerdata&…

Halcon转OpenCV实例--OCR字符识别(附源码)

导 读 本文主要介绍Halcon转OpenCV实例--OCR字符识别(附源码)。 实例来源 实例来源于51Halcon论坛的帖子,原贴地址: https://www.51halcon.com/forum.php?mod=viewthread&tid=889 Halcon实现 测试图: 实现代码与效果: read_image (Image, ET.png)decompose3…

智慧园区解决方案

智慧园区解决方案 智慧园区是以互联网为载体&#xff0c;“互联网产业”融合产业模式为手段&#xff0c;面向园区提供全产业链支撑服务的解决方案。能够帮助园区在信息化方面建立统一的组织管理协调架构&#xff0c;业务管理平台和对内对外服务运营平台。将相关资源形成紧密联…

Java最新学习路线

Java语言是目前流行的互联网等企业的开发语言&#xff0c;是市面上很多程序员喜欢并且在用的程序设计语言。关于学习java&#xff0c;有一部分人是为了就业或自己创业&#xff0c;而大多数人是希望使用java这个开发语言用来工作&#xff0c;开发出计算机后端系统&#xff0c;利…

python带你采集回车桌面高清写真壁纸

前言 大家早好、午好、晚好吖 ❤ ~ 壁纸嘛~大家都在用&#xff0c;每个人喜欢的壁纸类型也不同 那今天来教大家怎么批量保存一批高质量壁纸~ 开发环境: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip instal…

soapui + groovy 接口自动化测试

1.操作excel的groovy脚本 package pubimport jxl.* import jxl.write.Label import jxl.write.WritableWorkbookclass ExcelOperation {def xlsFiledef workbookdef writableWorkbookdef ExcelOperation(){}//设置xlsFile文件路径def ExcelOperation(xlsFile){this.xlsFile x…

景联文科技:您的模型性能问题需要标注数据来解决

为什么需要重新考虑模型开发当人们想到人工智能时&#xff0c;他们的脑海中常常充满对未来世界幻想的画面&#xff0c;在这个世界中&#xff0c;算法为机器人提供动力&#xff0c;这些机器人负责处理他们的日常职责。他们的虚拟助手为他们提供建议并管理他们的日程安排&#xf…

数组的复制与二维数组的用法

今天学习的主要内容有 数组的复制 数组的复制 利用循环进行数组的复制 import java.util.Arrays; public class Main3 {public static void main(String[] args) {int []arr new int[]{1,2,3,4,5,6};int []arr1 new int[arr.length];for (int i 0; i < arr.length; i…

SpringBoot 整合 Redis 缓存

文章目录前言1、缓存 概念知识1.1、什么是缓存1.2、缓存的优缺点1.3、为什么使用缓存2、Redis 概念知识2.1、Redis 简介2.2、为什么用 Redis 作为缓存2.3、Redis 支持的数据类型2.3、Redis是如何判断数据是否过期2.4、过期的数据的删除策略2.5、Redis 事务2.6、Redis 持久化机制…

Windows软件界面字体和图标太小的解决办法

有时候我们装好软件之后&#xff0c;打开软件会发现部分字体变得非常小&#xff0c;难以看清屏幕中的文字&#xff0c;如图所示&#xff1a; 下面小编在这里以Windows 11系统&#xff08;其余版本Windows系统的设置步骤没有改变&#xff0c;只是部分选项的位置有所改变&#xf…

开发不停机的服务程序

使用守护进程、心跳机制、调度程序实现服务程序永不死机。 调度程序:启动服务程序&#xff0c;服务程序死掉后调度程序休眠n秒再次调度。 进程心跳:使用共享内存维护自己的心跳信息&#xff0c;当前时间减去最新时间如果大于超时时间就认为故障了&#xff0c;守护进程就会遍历…

共享模型之不可变

1.日期转换的问题 1>.代码示例 Slf4j public class TestDateFormatDemo1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {//多个线程调用日期格式化对象的方法new Thread(…

kafka监控工具安装和使用

1. KafkaOffsetMonitor 该监控是基于一个jar包的形式运行&#xff0c;部署较为方便。只有监控功能&#xff0c;使用起来也较为安全(1)消费者组列表 (2)查看topic的历史消费信息. (3)每个topic的所有parition列表(topic,pid,offset,logSize,lag,owner) (4)对consumer消费情况进…