首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LeetCode 980. 不同路径 III(DFS+回溯)

LeetCode 980. 不同路径 III(DFS+回溯)

作者头像
Michael阿明
发布2020-07-13 15:57:31
发布2020-07-13 15:57:31
3910
举报

1. 题目

在二维网格 grid 上,有 4 种类型的方格:

  • 1 表示起始方格。且只有一个起始方格。
  • 2 表示结束方格,且只有一个结束方格。
  • 0 表示我们可以走过的空方格。
  • -1 表示我们无法跨越的障碍。

返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。

提示:1 <= grid.length * grid[0].length <= 20

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-iii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. DFS回溯

  • 网格地图之类的DFS套路解题,不难
代码语言:javascript
复制
class Solution {
    int sx,sy,ex,ey;//起点终点坐标
    int m,n,steps = 0;
    vector<vector<int>> dir = {{-1,0},{1,0},{0,1},{0,-1}};
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        int i, j;
        m = grid.size(), n = grid[0].size();
        for(i = 0; i < m; ++i)
        	for(j = 0; j < n; ++j)
        	{
        		if(grid[i][j] != -1)
        			steps++;//计算需要走的格子数
        		if(grid[i][j] == 1)
        			sx = i, sy = j;//起点
        		else if(grid[i][j] == 2)
        			ex = i, ey = j;//终点
        	}
		int paths = 0;
		grid[sx][sy] = -1;//起点标记走过了
		dfs(grid, sx, sy, 1, paths);
		return paths;
    }

    void dfs(vector<vector<int>>& grid, int x, int y, int step, int &paths) 
    {
    	if(x == ex && y == ey)//终点
    	{
    		if(step == steps)//走过所有的地方
    			paths++;//方案+1
    		return;
    	}
    	int x0, y0, origin;
    	for(int k = 0; k < 4; ++k)
    	{
    		x0 = x+dir[k][0];
    		y0 = y+dir[k][1];//周围四个方向坐标
    		if(x0 >= 0 && x0 < m && y0 >= 0 && y0 < n && grid[x0][y0] != -1)
    		{	//坐标未出界,且没有访问过
	    		origin = grid[x0][y0];//位置原始信息
    			grid[x0][y0] = -1;//访问过了
    			dfs(grid,x0,y0,step+1,paths);//dfs
    			grid[x0][y0] = origin;//回溯,恢复现场
    		}
    	}
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. DFS回溯
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档