Leetcode 1706、球会落在何处

本文解析了LeetCode题目1706中关于球在二维网格中的移动路径问题,重点讲解了如何使用深度优先搜索策略判断球是否会卡住并找出最终落点。通过终止条件和非终止条件的分析,展示了如何遍历网格并确定球的移动方向。

Leetcode 1706、球会落在何处

在这里插入图片描述
在这里插入图片描述

深度优先搜索

终止条件

1、球被卡住

  • 当前位置是1,并且当前位置是当前行最后一个位置,球无法出去,因为会被墙挡住;
    在这里插入图片描述
  • 当前位置是1,右边位置是-1,形成一个V,球会被卡住
    在这里插入图片描述
grid[row][column] == 1 && (column == grid[0].length - 1 || grid[row][column + 1] == -1)
  • 当前位置是-1,并且在当前行的第一个位置,会被墙卡住;
    在这里插入图片描述

  • 当前位置是-1,左边是1,形成V字,求会被卡住
    在这里插入图片描述

grid[row][column] == -1 && (column == 0 || grid[row][column - 1] == 1))

2、球正常出去

  • 当前在最后一行,当前位置为1,右边也为1,从右边那行出去
if(grid[row][column] == 1 && grid[row][column + 1] == 1 && row == grid.length - 1) {
    return column + 1;
}
  • 当前在最后一行,当前位置为-1,左边也为-1,从左边那行出去
    在这里插入图片描述
if(grid[row][column] == -1 && grid[row][column - 1] == -1 && row == grid.length - 1) {
    return column - 1;
}

非终止条件,继续遍历

if(grid[row][column] == 1) {
    row++;
    column++;
}else{
    row++;
    column--;
}

return dfs(row, column, grid);

完整代码

class Solution {
    public int[] findBall(int[][] grid) {
        int n = grid[0].length;
        int[] result = new int[n];
        for(int i = 0; i < n; i++) {
            result[i] = dfs(0, i, grid);
        }
        return result;
    }

    public int dfs(int row, int column, int[][] grid) {
        if((grid[row][column] == 1 && (column == grid[0].length - 1 || grid[row][column + 1] == -1))
        || (grid[row][column] == -1 && (column == 0 || grid[row][column - 1] == 1))) {
            return -1;
        }

        if(grid[row][column] == 1 && grid[row][column + 1] == 1 && row == grid.length - 1) {
            return column + 1;
        }

        if(grid[row][column] == -1 && grid[row][column - 1] == -1 && row == grid.length - 1) {
            return column - 1;
        }

        if(grid[row][column] == 1) {
            row++;
            column++;
        }else{
            row++;
            column--;
        }

        return dfs(row, column, grid);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值