题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10 来表示。

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

解题思路

定义了一个二维数组way,其中的元素代表从起点到对应位置的路径数。一开始给数组way遍历为每个元素赋初值为0。因为从起点到起点的路径数必定是1,所以给起点元素即way[0][0]赋值为1。

接下来重点讲一下算法,因为机器人只能向下或向右移动,所以机器人要从起点到达某个格子必须经过该格子的上面或左侧的格子,所以机器人要从起点到该格子的路径数为从起点到对应格子上面的格子的路径数加上从起点到对应格子左侧的格子的路径数,如图所示,机器人要从起点到A格子的路径数为从起点到B格子的路径数加上从起点到C格子的路径数。

除此之外,我们还要考虑到起点可能会放置障碍物,则路径数为0,所以有如下代码直接返回路径数为0。

if(obstacleGrid[0][0])return 0;

还要考虑到格子本身是障碍物的情况,则对应路径数必为0,与其初始值一致,故直接continue即可。

if(obstacleGrid[bl][bll])continue;

还要考虑到计算到格子路径数时格子位于首行或首列,则对应路径数只能为左侧路径数或上面的路径数。

if(bl)way[bl][bll]+=way[bl-1][bll];
if(bll)way[bl][bll]+=way[bl][bll-1];

最后计算完数组way的每一个元素后,函数返回way[n-1][m-1]即可。


代码

int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){int n=obstacleGridSize,m=obstacleGridColSize[0],bl,bll;int way[n][m];for(bl=0;bl<n;bl++)for(bll=0;bll<m;bll++)way[bl][bll]=0;way[0][0]=1;if(obstacleGrid[0][0])return 0;for(bl=0;bl<n;bl++)for(bll=0;bll<m;bll++){if(obstacleGrid[bl][bll])continue;if(bl)way[bl][bll]+=way[bl-1][bll];if(bll)way[bl][bll]+=way[bl][bll-1];}return way[n-1][m-1];
}

链接:https://leetcode-cn.com/problems/unique-paths-ii/solution/63bu-tong-lu-jing-ii-zai-li-kou-wan-chen-whvl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

力扣题库63-不同路径II(C语言)相关推荐

  1. leetcode题库--63不同路径 II

    不同路径 这题就是一个组合问题. int fun(int num){int ans = 1;while(num){ans*=num;num--;}return ans;}int uniquePaths ...

  2. 力扣题库设计循环队列

    题目要求: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列 ...

  3. 力扣题库-765.情侣牵手 最优解法

    题目描述 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...

  4. LeetCode-动态规划基础题-63. 不同路径II

    描述 63. 不同路径II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角 ...

  5. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  6. 63. 不同路径 II【动态规划】

    63.不同路径 II 题目链接:https://leetcode-cn.com/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 ...

  7. LeetCode:63. 不同路径 II

    题目链接 63. 不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图 ...

  8. 力扣题458:可怜的小猪

    力扣题458:可怜的小猪 有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水.它们从外观看起来都一样.为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断.不幸 ...

  9. 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)

    一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...

  10. 力扣:63. 不同路径 II

    题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 ...

最新文章

  1. 关于编程的浅学习与深学习
  2. python08-类与对象
  3. 生信入门必须掌握的 30 个 Linux 命令
  4. php如何在添加div的背景颜色_css3颜色渐变:css3如何实现背景颜色渐变?
  5. 7-28晚复习 虚继承与地址分配
  6. 排球比赛计分规则功能说明书
  7. python request url 转义_Python爬虫入门笔记
  8. ListView自适应实现表格
  9. visio 2013安装失败正在回滚
  10. 关于strict-origin-when-cross-origin404请求的问题
  11. 说出来你可能不信,我用 Python 破解了微信聊天记录
  12. 2018年——不平凡的一年
  13. 再无风清扬,再有少年郎
  14. php file get contents 总是超时,file_get_contents超时问题及解决方案
  15. swift/dart代码规范检查工具介绍
  16. layert弹出层关于layer.open,打开页面时的用法
  17. MySQL查询(DQL)之基础查询+条件查询+排序查询
  18. Typora的下载及MarkDown使用
  19. 安移通(ARUBA)WiFi短信验证:无线上网热点短信认证设置流程
  20. LVGL开发|lv_lib_100ask之lvgl中文输入(lv_100ask_pinyin_ime )-LVGL中文输入

热门文章

  1. 高速计数器转RS485Modbus RTU模块IBF150
  2. jquery案例4——jq动画、jq显示与隐藏(规定时间)滑动下拉slideDown,滑动上拉slideUp
  3. 如何突破编程学习的瓶颈期
  4. 计算机学习思维的培养
  5. 【游戏客户端】实现游戏中的小地图
  6. 利用python制作拼图_用python做一个三阶拼图
  7. PHP替换指定字符 阿星小栈
  8. java中isolate时间_Dart异步编程:Isolate和事件循环
  9. java 临时文件_java创建临时文件
  10. python窗口中导入图片_Python3 tkinter基础 Text image 文本框中插入图片