C语言算法-解答不同路径 II问题的C语言实现
题目:
一个机器人位于一个mxn
网格的左上角(起始点在下图中标记为'Start')。机器人每次只能向下或向右移动一步。网格中可能存在障碍物,障碍物用1
表示。机器人试图达到网格的右下角(在下图中标记为'Finish')。问总共有多少条不同的路径?
引言:
不同路径 II问题要求计算从起始点到终点的不同路径数,但与不同路径问题不同的是,网格中可能存在障碍物。本文将使用C语言来解答这个算法问题,并给出C代码实现。我们会详细介绍算法思路,并进行代码实现、算法分析、示例和测试、总结。
算法思路:
为了解决不同路径 II问题,我们可以使用回溯算法来递归搜索所有可能的路径。
具体算法步骤如下:
- 创建一个递归函数
dfs
,其中的参数包括当前位置(x, y)
,网格的行数m
,网格的列数n
,以及网格obstacleGrid
。 - 如果当前位置
(x, y)
越界,或者有障碍物(obstacleGrid[x][y] == 1)
,返回0,表示无法通过该位置。 - 如果当前位置为终点
(x, y) == (m-1, n-1)
,返回1,表示找到一条路径。 - 否则,分别向下和向右递归调用
dfs
函数,将结果相加,即dfs(x + 1, y, m, n, obstacleGrid) + dfs(x, y + 1, m, n, obstacleGrid)
。
代码实现:
#include <stdio.h>
#include <stdbool.h>
int dfs(int x, int y, int m, int n, int** obstacleGrid) {
if (x >= m || y >= n || obstacleGrid[x][y] == 1) {
return 0;
}
if (x == m - 1 && y == n - 1) {
return 1;
}
return dfs(x + 1, y, m, n, obstacleGrid) + dfs(x, y + 1, m, n, obstacleGrid);
}
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {
int m = obstacleGridSize;
int n = obstacleGridColSize[0];
return dfs(0, 0, m, n, obstacleGrid);
}
算法分析:
- 时间复杂度:由于我们需要遍历网格中的每个位置,算法的时间复杂度为O(m * n),其中m是网格的行数,n是网格的列数。
- 空间复杂度:由于使用了递归函数,算法的空间复杂度取决于递归的深度,最坏情况下为O(m + n),其中m和n分别是网格的行数和列数。
示例和测试:
示例1:
输入: obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出: 2
示例2:
输入: obstacleGrid = [[0,1],[0,0]]
输出: 1
总结:
通过使用回溯算法,我们用C语言实现了解决不同路径 II问题的代码。这个算法虽然简单,但在某些情况下可能会出现大量的重复计算,导致效率较低。希望本文能够帮助你理解解决这个算法问题的思路和方法。