LeetCode:529 SL

2022-09-25  本文已影响0人  alex很累

问题链接

529 SL

问题描述

给你一个大小为 m x n 二维字符矩阵 board ,表示盘面,其中:
M 代表一个 未挖出的 地雷,
E 代表一个 未挖出的 空方块,
B 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块,
数字(18)表示有多少地雷与这块 已挖出的 方块相邻,
X 则表示一个 已挖出的 地雷。
给你一个整数数组 click ,其中 click = [clickr, clickc] 表示在所有 未挖出的 方块(M 或者 E)中的下一个点击位置(clickr 是行下标,clickc 是列下标)。

根据以下规则,返回相应位置被点击后对应的盘面:
如果一个地雷M被挖出,游戏就结束了- 把它改为 X
如果一个 没有相邻地雷 的空方块E被挖出,修改它为B,并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
如果一个 至少与一个地雷相邻 的空方块E被挖出,修改它为数字18 ,表示相邻地雷的数量。
如果在此次点击中,若无更多方块可被揭露,则返回盘面。

示例

解题思路

模拟法+深度优先搜索直接冲!

代码示例(JAVA)

class Solution {
    int[] arrX = {1, -1, 0, 0, 1, -1, 1, -1};
    int[] arrY = {0, 0, 1, -1, 1, -1, -1, 1};

    public char[][] updateBoard(char[][] board, int[] click) {
        dfs(board, click);
        return board;
    }

    public void dfs(char[][] board, int[] click) {
        int m = board.length, n = board[0].length;
        int x = click[0], y = click[1];
        if (board[x][y] == 'M') {
            board[x][y] = 'X';
            return;
        }
        int count = 0;
        for (int i = 0; i < arrX.length; i++) {
            if (x + arrX[i] >= 0 && x + arrX[i] < m && y + arrY[i] >= 0 && y + arrY[i] < n
                    && board[x + arrX[i]][y + arrY[i]] == 'M') {
                count++;
            }
        }
        if (count != 0) {
            board[x][y] = (char) (count + 48);
        } else {
            board[x][y] = 'B';
            for (int i = 0; i < arrX.length; i++) {
                if (x + arrX[i] >= 0 && x + arrX[i] < m && y + arrY[i] >= 0 && y + arrY[i] < n
                        && (board[x + arrX[i]][y + arrY[i]] == 'M' || board[x + arrX[i]][y + arrY[i]] == 'E')) {
                    dfs(board, new int[]{x + arrX[i], y + arrY[i]});
                }
            }
        }
    }
}

执行结果

上一篇 下一篇

猜你喜欢

热点阅读