LeetCode 529. Minesweeper(529. 扫雷游戏)

题目地址:529. 扫雷游戏
思路:
深度优先

public class Solution {
    // 坐标相邻的8个方向 上,下,左,右,左上,左下,右上,右下
    private int[][] dirs = {{0,1},{0,-1},{-1,0},{1,0},{-1,1},{-1,-1},{1,1},{1,-1}};
    public char[][] updateBoard(char[][] board, int[] click) {
        // 获取当前坐标
        int row = click[0], col = click[1];
        // 边界条件
        int m = board.length, n = board[0].length;

        // 如果找到M(未挖出的雷)或者X(已挖出的雷)游戏结束
        if (board[row][col] == 'M' || board[row][col] == 'X') {
            board[row][col] = 'X';
            return board;
        }

        // 找周边有几个雷
        int num = 0;
        for (int[] dir : dirs) {
            int newRow = dir[0] + row;
            int newCol = dir[1] + col;
            // 如果周围是未被揭开的雷,周围雷的数量递增
            if (newRow >= 0 && newCol >= 0 && newRow < m && newCol < n && board[newRow][newCol] == 'M') {
                num++;
            }
        }

        // 如果周围有雷
        if (num > 0) {
            board[row][col] = (char) (num + '0');
            return board;
        }

        // 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B')
        board[row][col] = 'B';
        for (int[] dir : dirs) {
            int newRow = dir[0] + row;
            int newCol = dir[1] + col;
            // 所有和其相邻的未挖出方块都应该被递归地揭露。
            if (newRow >= 0 && newCol >= 0 && newRow < m && newCol < n && board[newRow][newCol] == 'E') {
                updateBoard(board,new int[]{newRow,newCol});
            }
        }

        return board;
    }
}
posted @ 2020-08-20 10:44  李小争  阅读(122)  评论(0编辑  收藏  举报