不同路劲 III dfs解决
可以看出, 他是有一个随机的起始位置,和随机的结束位置,然后剩余的地方遍布0和-1
0是可以走的,-1是不可以走的,而且需要走完所有0的位置
向遍历一遍数组grid,得到0的个数和起始位置,然后可以使用dfs从起始位置深度遍历所有可能的路径,遇到-1不能走,碰到2的话要判断当前是否算是合理的路径切需要判断0的所有位置是否是走完了,所以需要记录下走过的0的位置,而且不能走已经走过的,那么就还需要一个数组来记录走过的位置,dfs是上下左右递归,可以使用俩个数组dx,dy来表示向上下左右的递归,这样就可以知道了递归的参数了,x,y,count 代表了当前的位置,count表示的是遍历的0的个数
int mUnique, nUnique, count0Unique;int startxUnique, startyUnique;int retUnique;int[][] gridUnique;int[] dyUnique = {-1, 1, 0, 0};int[] dxUnique = {0, 0, -1, 1};boolean[][] checkUnique;public int uniquePathsIII(int[][] _grid) {gridUnique = _grid;mUnique = grid.length;nUnique = grid[0].length; retUnique = 0;check = new boolean[mUnique][nUnique];for(int y = 0; y < mUnique; y++){for(int x = 0; x < nUnique; x++){int v = grid[y][x];if(v == 0) count0Unique++;else if(v == 1) {startxUnique = x; startyUnique = y;}}}recursionUnique(startyUnique, startxUnique, -1);return retUnique;}void recursionUnique(int y, int x, int count){if(grid[y][x] == 2){if(count == count0Unique) retUnique++;return;}for(int i = 0; i < 4; i++){int yy = y + dy[i];int xx = x + dx[i];if(yy < 0 || yy == mUnique || xx < 0 || xx == nUnique || check[yy][xx] || grid[yy][xx] == -1){continue;}check[y][x] = true;recursion(yy, xx, count + 1);check[y][x] = false;}}