力扣63.不同路径||

该博客介绍了如何使用动态规划解决含有障碍物的网格中找到唯一路径的问题。首先处理第一行和第一列的障碍物,然后通过遍历网格,当遇到1(障碍物)时置为0,否则将当前位置的路径数设置为上一个位置和左一个位置的路径数之和。最后返回右下角的路径数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

解析:

本题主要就是考虑这个障碍物,当然障碍物还是很好解决的,就是我们在初始化记录的时候我们每记录一个为一的数,就把这个这个数改为0。

因为这个走法是只能向下或者向右的,所以我是把这个题目分解成两步。

第一步:

先把第一行、第一列的数据考虑一下,并且记录保存。

注意:在找到1后,我们要考虑1后面的数据,它应该变为0,因为它们是无效的数据了。

	//第一行
    int i;
	for ( i = 0; i < n;++i) {
		if (obstacleGrid[0][i] == 1) {//在第一行中,只要找到一个1就结束程序
			obstacleGrid[0][i] = 0;
			break;
		}
		obstacleGrid[0][i] = 1;
	}
	while (i < n) {                   //把找到的1后面的数据都变为0
		obstacleGrid[0][i] = 0;
		i++;
	}
//第一列
    int j;
	for (j = 1; j < m; ++j) {
		if (obstacleGrid[j][0] == 1) {
          obstacleGrid[j][0] = 0;
		  break;
		}
		obstacleGrid[j][0] = 1;
	}
	while (j < m) {
		obstacleGrid[j][0] = 0;
		j++;
	}

第二步:

第二步就是同样的思路了,如果在其中发现有个1,那么它这个位置就变为0,但是与上一步不同的是,如果不为0那么就加上上面和左边的数据,这是个选择判断。

for (int i = 1; i < m; i++) {
		for (int j = 1; j < n; j++) {
			if (obstacleGrid[i][j] == 1)
				obstacleGrid[i][j] = 0;
			else
				obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
		}
	}

代码:

class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
	int m = obstacleGrid.size(), n = obstacleGrid[0].size();
	if (obstacleGrid[0][0] == 1) return 0;
	int i;
	for ( i = 0; i < n;++i) {
		if (obstacleGrid[0][i] == 1) {
			obstacleGrid[0][i] = 0;
			break;
		}
		obstacleGrid[0][i] = 1;
	}
	while (i < n) {
		obstacleGrid[0][i] = 0;
		i++;
	}
	int j;
	for (j = 1; j < m; ++j) {
		if (obstacleGrid[j][0] == 1) {
          obstacleGrid[j][0] = 0;
		  break;
		}
		obstacleGrid[j][0] = 1;
	}
	while (j < m) {
		obstacleGrid[j][0] = 0;
		j++;
	}
	for (int i = 1; i < m; i++) {
		for (int j = 1; j < n; j++) {
			if (obstacleGrid[i][j] == 1)
				obstacleGrid[i][j] = 0;
			else
				obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
		}
	}
	return obstacleGrid[m - 1][n - 1];
}
};

代码不是dp的规范化,希望大佬们指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值