鱼C论坛

 找回密码
 立即注册
查看: 870|回复: 1

[技术交流] C++刷leetcode(980. 不同路径 III)【深度优先搜索+回溯】

[复制链接]
发表于 2020-5-29 11:50:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
  1. 在二维网格 grid 上,有 4 种类型的方格:

  2. 1 表示起始方格。且只有一个起始方格。
  3. 2 表示结束方格,且只有一个结束方格。
  4. 0 表示我们可以走过的空方格。
  5. -1 表示我们无法跨越的障碍。
  6. 返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。

  7.  

  8. 示例 1:

  9. 输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
  10. 输出:2
  11. 解释:我们有以下两条路径:
  12. 1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
  13. 2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)
  14. 示例 2:

  15. 输入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]]
  16. 输出:4
  17. 解释:我们有以下四条路径:
  18. 1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
  19. 2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3)
  20. 3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3)
  21. 4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)
  22. 示例 3:

  23. 输入:[[0,1],[2,0]]
  24. 输出:0
  25. 解释:
  26. 没有一条路能完全穿过每一个空的方格一次。
  27. 请注意,起始和结束方格可以位于网格中的任意位置。
  28.  

  29. 提示:

  30. 1 <= grid.length * grid[0].length <= 20
复制代码


  1. class Solution {
  2. public:
  3.     void dfs(vector<vector<int> > &grid, int& res, vector<vector<int> >& visit,
  4.     int start1, int start2, int sum, int len){
  5.         if(grid[start1][start2] == -1|| visit[start1][start2] == 3)return;
  6.         if(grid[start1][start2] == 2){
  7.             if(sum == len-1)res++;
  8.             return;
  9.         }
  10.         visit[start1][start2] = 3;
  11.         if(start1 + 1 < grid.size())dfs(grid, res, visit, start1+1, start2, sum, len+1);
  12.         if(start1 - 1 >= 0)dfs(grid, res, visit, start1-1, start2, sum, len+1);
  13.         if(start2 + 1 < grid[0].size())dfs(grid, res, visit, start1, start2+1, sum, len+1);
  14.         if(start2 - 1 >= 0)dfs(grid, res, visit, start1, start2-1, sum, len+1);
  15.         if(grid[start1][start2] == 1)return;
  16.         else visit[start1][start2] = 0;
  17.     }
  18.     int uniquePathsIII(vector<vector<int>>& grid) {
  19.         int res = 0;
  20.         int len1 = grid.size(), len2 = grid[0].size();
  21.         vector<vector<int> > visit = grid;
  22.         int start1,start2;
  23.         int sum = 0;
  24.         for(int i = 0; i < len1; i++){
  25.             for(int j = 0; j < len2; j++){
  26.                 if(grid[i][j] == 1){
  27.                     start1 = i;
  28.                     start2 = j;
  29.                 }
  30.                 else if(grid[i][j] == 0) sum++;
  31.             }
  32.         }
  33.         dfs(grid, res, visit, start1, start2, sum, 0);
  34.         return res;
  35.     }
  36. };
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-29 11:51:40 | 显示全部楼层
注意题目描述:“每一个无障碍方格都要通过一次”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-3 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表