剣はオファー13を指します。ロボットの可動域

剣はオファー13を指します。ロボットの可動域

タイトル説明

ここに画像の説明を挿入

問題解決のアイデア

オファー12のマトリックス内のパスの違いに注意してください。

この質問ボックスの各要素は、プロセス全体で1回だけ訪問できます。特定の要素が訪問されている限り、訪問済みはtrueとしてマークされます。

したがって、この質問は通常のDFSトラバーサルであり、訪問された配列が訪問をマークし、バックトラックではありません。

class Solution {
    
    
    public int movingCount(int m, int n, int k) {
    
    
        boolean[][] visited = new boolean[m][n];
        return dfs(m, n, 0, 0, k, visited);
    }
    //计算从[row, col]开始,能够到达多少格子
    int dfs(int m, int n, int row, int col, int k, boolean[][] visited) {
    
    
        //base case:如果越界,或者行列数位之和大于k,或者已经访问过,则直接返回
        if (row < 0 || row >= m || col < 0 || col >= n || !isValid(row, col, k) || visited[row][col])
            return 0;
        //只要访问过,就标记为true
        visited[row][col] = true;
        //四个方向
        return 1 + dfs(m, n, row + 1, col, k, visited)
                 + dfs(m, n, row - 1, col, k, visited)
                 + dfs(m, n, row, col + 1, k, visited)
                 + dfs(m, n, row, col - 1, k, visited);

    }
    //判断当前位置的行列数位之和是否大于k,如果大于k,则说明非法,返回false
    boolean isValid(int row, int col, int k) {
    
    
        if (getDigitSum(row) + getDigitSum(col) > k)
            return false;
        return true;
    }
    //计算一个数字的数位之和
    int getDigitSum(int number) {
    
    
        int sum = 0;
        while (number > 0) {
    
    
            sum += number % 10;
            number /= 10;
        }
        return sum;
    }
}

おすすめ

転載: blog.csdn.net/cys975900334/article/details/114764982