LeetCode(动态规划):980. 不同路径 III
关于 leetcode 980.不同路径III
将原本仅返回符合题意的路径数改为所有符合题意的具体路径
下面的code是将int 改为List<List<int[]>>
Code
这里没有写严谨的对数器去测试,但两种返回类型都是同一种思路,那我就不浪费时间了
// 整体思路和原本的题完全一样,仅仅只是因为在返回值上做一些改动而改动了一些细节
// 不同路径:原题输出结果为符合题意的路径数,将输出结果改为符合题意的具体路径
public class Solution {
// ans 用来存储所有符合题意的路径
static List<List<int[]>> ans = new ArrayList<>();
// tmp 用来存储 row col 也就是符合题意的具体路径 int {row, col}
static List<int[]> temp = new ArrayList<>();
/**
*
* @param grid 二维网格
* @return 返回值为 List<List<int[]>> 类型
* 内层List对应的是temp存储具体的路径
* 外层存所有符合题意的路径
* 每个路径上的点都用 int[]{row, col} 存储
*/
public static List<List<int[]>> uniquePathsIII(int[][] grid) {
// 同样的初始化需要的参数
int R = grid.length, L = grid[0].length, row = 0, col = 0, M = 0;
for (int r = 0;r < R;r++) {
for (int c = 0;c < L;c++) {
if(grid[r][c] == 1) {
row = r; col = c; M++;
} else if (grid[r][c] == 0) M++;
}
}
// 这里设计的f函数就没有返回值了,但他是可以影响到全局的ans的
f(grid,R,L,M,row,col);
// 函数执行完了ans自然就存进了符合题意的所有路径
return ans;
}
/**
* 回溯
* @param grid 二维网格
* @param R 网格下边界
* @param L 网格右边界
* @param M 剩余格子可通过数
* @param row 当前行
* @param col 当前列
*/
public static void f(int[][] grid, int R, int L, int M, int row, int col) {
// 来到终点并且所有可通过的点都过了一遍就是符合题意的
if (grid[row][col] == 2 && M == 0) {
//
temp.add(new int[]{row, col});
// 这个时候就可以将这个符合题意的单条路径存入ans
ans.add(new ArrayList<>(temp));
temp.remove(temp.size()-1);
return;
}
// 碰到障碍或单纯的来到终点都是不符合题意直接返回
if (grid[row][col] == -1 || grid[row][col] == 2) return;
// 拿零时变量记录当前点原本的值
int tmp = grid[row][col];
// 将当前点标记为以走过
grid[row][col] = -1;
// 将当前已走过的点存入temp这个还未成型的路径当中
temp.add(new int[]{row, col});
//-----------------------------------------
// 下面的操作整体是由当前点出发决定上下左右四个方向上的移动
// 如果当前位置不在上边界,就可以向上走
if (row != 0) f(grid,R,L,M-1,row-1,col);
// 如果当前位置不在下边界,就可以向下走
if (row != R-1) f(grid,R,L,M-1,row+1,col);
// 如果当前位置不在左边界,就可以向左走
if (col != 0) f(grid,R,L,M-1,row,col-1);
// 如果当前位置不在右边界,就可以向右走
if (col != L-1) f(grid,R,L,M-1,row,col+1);
//----------------------------------------------
// 下面两个操作是为了不影响做下一次决定
// 四个方向的决定做完返回到当前点,将当前点还原会做决定之前的值
// 也就是之前记录在tmp里面的值
grid[row][col] = tmp;
// 将temp里最后一个点删除
temp.remove(temp.size()-1);
}
// 文本表达
public static String toString(List<int[]> path) {
String p = "";
for (int[] point : path) {
p += "(" + point[0] + ", " + point[1] + ")" + " -> ";
}
return p + "end";
}
public static void main(String[] args) {
// leetcode例子1
int[][] grid1 = new int[][] {
{1,0,0,0},
{0,0,0,0},
{0,0,2,-1}
};
// leetcode例子2
int[][] grid2 = new int[][] {
{1,0,0,0},
{0,0,0,0},
{0,0,0,2}
};
List<List<int[]>> allPath = uniquePathsIII(grid2);
for (List<int[]> path : allPath) {
System.out.println(toString(path));
}
}
}

