力扣面试题 - 40 迷路的机器人 C语言解法

news/2024/12/28 5:14:38/

题目:

设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。

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

返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。

示例 1:

输入:
[[0,0,0],[0,1,0],[0,0,0]
]
输出: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解释: 
输入中标粗的位置即为输出表示的路径,即
0行0列(左上角) -> 0行1列 -> 0行2列 -> 1行2列 -> 2行2列(右下角)

说明:r 和 的值均不超过 100。

思路:

  1. 深度优先(DFS)寻找终点。
  2. 使用visited数组记录走过的路径
  3. 发现不可行的路径就回溯,直到到达终点

以下C代码有参考题解区大佬:taopi

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/int visited[100][100];
int DFS(int** obstacleGrid, int r, int c, int x, int y, int** ret, int* len) {// 碰到边界或者障碍,或者重复到达if(x >= r || y >= c || obstacleGrid[x][y] || visited[x][y]){return 0;}ret[*len][0] = x;ret[(*len)++][1] = y;// 到达终点if(x == r - 1 && y == c - 1) {return 1;}visited[x][y] = 1;// 下或者右 有路可走if(DFS(obstacleGrid, r, c, x, y + 1, ret, len) || DFS(obstacleGrid, r, c, x + 1, y, ret, len)){return 1;}// 无路可走,回溯(*len)--;return 0;
}int** pathWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize, int* returnSize, int** returnColumnSizes) {*returnSize = 0;int r = obstacleGridSize, c = *obstacleGridColSize;if(r == 0 || c == 0 || obstacleGrid[0][0] || obstacleGrid[r-1][c-1]) {return NULL;}int** ret = malloc(sizeof(int*) * (r + c));for(int i = 0; i < r + c; i++){ret[i] = malloc(sizeof(int) * 2);}int len = 0;memset(visited, 0, sizeof(visited));if(DFS(obstacleGrid, r, c, 0, 0, ret, &len)) {*returnSize = len;*returnColumnSizes = (int*)malloc(sizeof(int) * len);for(int i = 0; i < len; i++) {(*returnColumnSizes)[i] = 2;}return ret;}for(int i = 0; i < r + c; i++){free(ret[i]);}free(ret);return NULL;
}


http://www.ppmy.cn/news/1558700.html

相关文章

龙智出席2024零跑智能汽车技术论坛,分享功能安全、需求管理、版本管理、代码扫描等DevSecOps落地实践

龙智快讯 2024年12月5日&#xff0c;由零跑和盖世汽车主办的“2024零跑智能汽车技术论坛”在杭州零跑总部圆满落幕。此次技术论坛聚焦AI语言大模型、AUTOSAR AP平台、DevOps、端到端自动驾驶等热点话题展开探讨&#xff0c;旨在推动智能汽车技术的创新与发展。 龙智作为国内领先…

Android Studio | 连接手机设备后,启动App时出现:Waiting For DebuggerApplication (App名)...

在这种情况下&#xff0c;打开目录文件&#xff0c;出现 Is:/storage/emulated/: Permission denied 问题分析&#xff1a; 以上两种情况表明应用程序试图访问Android设备的存储空间中的/storage/emulated/目录&#xff0c;但是没有足够的权限去执行这个操作。 解决办法&…

目前最流行的 Rust Web 框架有哪些?

目前最流行的 Rust Web 框架有哪些? 1. Actix Web:高性能之王,老牌框架 特点: 高性能:基于 Actor 模型,是目前 Rust 生态中最成熟、性能最强的 Web 框架之一。功能强大:支持 HTTP/1.x、HTTP/2、WebSocket 等,内置中间件和多种插件。社区支持广泛:拥有大量使用者,资料…

Redis——缓存穿透

文章目录 1. 问题介绍1.1 定义1.2 举例 2. 解决方案2.1 方案一&#xff1a;空值缓存2.1.1 做法2.1.2 举例2.1.3 示例代码2.1.4 优点2.1.5 缺点 2.2 方案二&#xff1a;布隆过滤器2.2.1 思想2.2.2 做法2.2.3 示例代码2.2.4 优点2.2.5 缺点 2.3 方案三&#xff1a;限流 3. 总结 1…

【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考

文章日期&#xff1a;2024.12.24 使用工具&#xff1a;Python&#xff0c;Node.js 逆向类型&#xff1a;webpack类型 本章知识&#xff1a;sign模拟生成&#xff0c;密文的解密(webpack)&#xff0c;全程扣代码&#xff0c;仅供学习参考 文章难度&#xff1a;低等&#xff08;没…

39.1 用最近1天的内存平均使用率等出业务资源利用率报表

本节重点介绍 : 纵向聚合VS横向聚合用最近1天的内存平均使用率等出业务资源利用率报表 为了降低成本合理配置资源 纵向聚合VS横向聚合 普通的聚合函数是纵向聚合 普通的聚合函数是纵向聚合&#xff0c;也就是多个series进行聚合如求机器的平均cpu user态利用率 avg(rate(…

概率论基础知识点公式汇总

1 概率论的基本概念 1.1 随机事件 样本空间 S S S&#xff1a;将随机实验所有可能的记过组成的集合称为样本空间。样本点&#xff1a;样本空间的每个结果称为样本点。随机试验、随机事件 E E E、基本事件、必然事件、不可能事件、对立事件 A A ‾ A\overline{A} AA、古典概型…

设计模式01:创建型设计模式之单例、简单工厂的使用情景及其基础Demo

一、单例模式 1.情景 连接字符串管理 2.好处 代码简洁&#xff1a;可全局访问连接字符串。性能优化&#xff1a;一个程序一个连接实例&#xff0c;避免反复创建对象&#xff08;连接&#xff09;和销毁对象&#xff08;连接&#xff09;。线程安全&#xff1a;连接对象不会…