题目
思路
思路一:暴力递归+回溯,由于要求每条路径不能重复,因此我们可以通过回溯避免重复,又因为有四个方向,所以需要递归四个方向,递归结束条件:要求所有为0的都要走过一次,所以我们可以记录0的个数,然后每走一个就减去一个0个数,当个数为0时并且上下左右其中的一个就是终点,递归结束
代码
//1.暴力递归+回溯public int uniquePathsIII(int[][] grid) {int target = 0, startI = 0, startJ = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 0) target++;if (grid[i][j] == 2) {startI = i;startJ = j;}}}//避免[1,2]或[2,1]情况if (target == 0 && (startI - 1 >= 0&& grid[startI - 1][startJ] == 1 || startJ - 1 >= 0&& grid[startI][startJ - 1] == 1 || startI + 1 < grid.length&& grid[startI + 1][startJ] == 1 || startJ + 1 < grid[0].length&& grid[startI][startJ + 1] == 1)) return 1;return recur(grid, startI + 1, startJ , target)+ recur(grid, startI, startJ + 1, target)+ recur(grid, startI - 1, startJ, target)+ recur(grid, startI, startJ - 1, target);}public int recur(int[][] grid, int i, int j, int target) {if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length|| grid[i][j] != 0)return 0;target -= 1;if (target == 0 && (i - 1 >= 0&& grid[i - 1][j] == 1 || j - 1 >= 0&& grid[i][j - 1] == 1 || i + 1 < grid.length&& grid[i + 1][j] == 1 || j + 1 < grid[0].length&& grid[i][j + 1] == 1))return 1;grid[i][j] = 3;int res = recur(grid, i + 1, j , target)+ recur(grid, i, j + 1, target)+ recur(grid, i - 1, j, target)+ recur(grid, i, j - 1, target);grid[i][j] = 0;return res;}
