529. Minesweeper(529. 掃雷游戲)

題目地址:529. 掃雷游戲

思路:
深度優(yōu)先

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) {
        // 獲取當(dāng)前坐標
        int row = click[0], col = click[1];
        // 邊界條件
        int m = board.length, n = board[0].length;

        // 如果找到M(未挖出的雷)或者X(已挖出的雷)游戲結(jié)束
        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;
            // 如果周圍是未被揭開的雷,周圍雷的數(shù)量遞增
            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;
            // 所有和其相鄰的未挖出方塊都應(yīng)該被遞歸地揭露。
            if (newRow >= 0 && newCol >= 0 && newRow < m && newCol < n && board[newRow][newCol] == 'E') {
                updateBoard(board,new int[]{newRow,newCol});
            }
        }

        return board;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容