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

题目:

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

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

返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 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列(右下角)

说明: rc的值均不超过 100。

思路:

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

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

cpp 复制代码
/**
 * 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;
}
相关推荐
夏乌_Wx1 分钟前
练题100天——DAY31:相对名次+数组拆分+重塑矩阵
数据结构·算法
LYFlied2 分钟前
【算法解题模板】-解二叉树相关算法题的技巧
前端·数据结构·算法·leetcode
Ven%26 分钟前
【AI大模型算法工程师面试题解析与技术思考】
人工智能·python·算法
天勤量化大唯粉27 分钟前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
爱学习的小仙女!42 分钟前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ1 小时前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard1 小时前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
Deepoch1 小时前
仓储智能化新思路:以“渐进式升级”破解物流机器人改造难题
大数据·人工智能·机器人·物流·具身模型·deepoc·物流机器人
Trouvaille ~1 小时前
【C++篇】把混沌映射成秩序:哈希表的底层哲学与实现之道
数据结构·c++·stl·哈希算法·散列表·面向对象·基础入门
Yeats_Liao2 小时前
MindSpore开发之路(四):核心数据结构Tensor
数据结构·人工智能·机器学习