LeetCodeの異なるパスIII

1.タイトル

ここに画像の説明を挿入します
ここに画像の説明を挿入します

アイデア(Java言語での説明)

従来のDFS +バックトラッキングアルゴリズムであるこの問題の制限条件は、2次元配列の0の数と、この条件付き判断を計算する必要があることです。

class Solution {
    
    

    //0 1
    //2 0

    int rowLen;
    int colLen;
    int totalCnt = 0;

    public int uniquePathsIII(int[][] grid) {
    
    
        rowLen = grid.length;
        colLen = grid[0].length;
        int zeroNum = getZeroNum(grid);
        for(int i = 0;i<rowLen;i++){
    
    
            for(int j = 0;j<colLen;j++){
    
    
                if(grid[i][j] == 1){
    
    
                    dfs(i,j,grid,0,zeroNum);
                    break;
                }
            }
        }
        return totalCnt;
    }

    public void dfs(int i,int j,int[][] grid,int temp,int zeroNum){
    
    
        if(!checkBoard(i,j) || grid[i][j] == -1){
    
    
            return;
        }
        if(temp!=zeroNum+1 && grid[i][j] == 2){
    
    
            return;
        }
        if(temp == zeroNum+1 && grid[i][j] == 2){
    
    
            totalCnt++;
            return;
        }
        grid[i][j] = -1;
        dfs(i-1,j,grid,temp+1,zeroNum);
        dfs(i,j+1,grid,temp+1,zeroNum);
        dfs(i+1,j,grid,temp+1,zeroNum);
        dfs(i,j-1,grid,temp+1,zeroNum);
        grid[i][j] = 0;
    }

    public int getZeroNum(int[][] grid){
    
    
        int cnt = 0;
        for(int i = 0;i<rowLen;i++){
    
    
            for(int j = 0;j<colLen;j++){
    
    
                if(grid[i][j] == 0){
    
    
                    cnt++;
                }
            }
        }
        return cnt;
    }

    public boolean checkBoard(int i,int j){
    
    
        if(i>=rowLen || i<0) return false;
        if(j>=colLen || j<0) return false;
        return true;
    }

}

総括する

この質問を初めて書いた後、テスト結果は常に0です。長い間考えた結果、問題以外の判断条件であるディープサーチのステップ数(temp)はzeroNumに等しいはずであることがわかりました。 zeroNumの代わりに+1

おすすめ

転載: blog.csdn.net/weixin_43967679/article/details/108871886