ソードフィンガーオファー13.ロボットの可動域-幅優先探索BFS

座標[0,0]から座標[m-1、n-1]まで、地面にm行n列の正方形があります。ロボットは座標[0、0]のグリッドから移動を開始します。ロボットは、一度に1グリッドずつ左、右、上、下に移動でき(グリッドの外側には移動できません)、行座標の合計を入力できません。 k格子より大きい列座標。たとえば、kが18の場合、3 + 5 + 3 + 7 = 18であるため、ロボットは正方形[35、37]に入ることができます。しかし、3 + 5 + 3 + 8 = 19であるため、正方形[35、38]に入ることができません。ロボットはいくつのグリッドに到達できますか?

例1:

入力:m = 2、n = 3、k = 1
出力:3
例2:

入力:m = 3、n = 1、k = 0
出力:1

出典:LeetCode
リンク:クリックしてhttps://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcofにジャンプ

幅優先探索

//广度优先遍历BFS
public class Work2 {
    
    

    public int movingCount(int m, int n, int k) {
    
    
        boolean[][] isUsed = new boolean[m][n]; //走过的格子为true
        Queue<int[]> queue = new LinkedList<>();//队列来放格子的x和y下标
        queue.offer(new int[]{
    
    0,0});    //给队列放最左上角的格子
        isUsed[0][0] = true;    //左上角格子置为走过的格子
        int count = 1;  //用来计数可以走的格子数
        int[] addx = {
    
    0, 1};    //用来向右移动
        int[] addy = {
    
    1, 0};    //用来向下移动
        //出循环条件:队列为空
        while(!queue.isEmpty()) {
    
    
            int[] arr = queue.poll();   //出队并记录此格子位置
            //依次遍历此格子的右格子和下格子
            //i==0 遍历右格子
            //i==1 遍历下格子
            for(int i = 0; i < 2; i++) {
    
    
                int x = arr[0] + addx[i];   //让x下标走动
                int y = arr[1] + addy[i];   //让y下标走动
                //如果走后的格子为以下条件,则这个格子不能走到,自然不能入队
                //1.该位置越界
                //2.该位置超过k条件
                //3.该位置已经走过了
                if(x < 0 || x > m-1 || y < 0 || y > n-1 || sum(x)+sum(y) > k || isUsed[x][y]) {
    
    
                    continue;
                }
                //程序能走到这里,证明此位置可以走到,则让此位置入队
                queue.offer(new int[]{
    
    x,y});    //入队此格子
                isUsed[x][y] = true;    //此格子置为走过的格子
                count++;    //可以走的格子数加一
            }
        }
        //程序走到这,说明队列里已经没有了可以遍历的格子,最后返回可以走的格子数
        return count;
    }

    //返回该数所有位的和 例如123 返回1+2+3=6
    public int sum(int a) {
    
    
        int count = 0;
        while(a != 0) {
    
    
            count = count + a%10;
            a = a/10;
        }
        return count;
    }

}

深さ優先探索

//深度优先遍历DFS
public class Work1 {
    
    

    public int movingCount(int m, int n, int k) {
    
    
        boolean[][] isUsed = new boolean[m][n];
        return dfs(0, 0, m, n, k, isUsed);
    }

    public int dfs(int i, int j, int m, int n, int k, boolean[][] isUsed) {
    
    
        if(i < 0 || i > m-1 || j < 0 || j > n-1 || sum(i)+sum(j) > k || isUsed[i][j]) {
    
    
            return 0;
        }
        isUsed[i][j] = true;
        int result = dfs(i-1, j, m, n, k, isUsed) +
                dfs(i+1, j, m, n, k, isUsed) +
                dfs(i, j-1, m, n, k, isUsed) +
                dfs(i, j+1, m, n, k, isUsed) + 1;
        return result;
    }

    public int sum(int a) {
    
    
        int count = 0;
        while(a != 0) {
    
    
            count = count + a%10;
            a = a/10;
        }
        return count;
    }

}

おすすめ

転載: blog.csdn.net/starry1441/article/details/114836643