程式語言 - LeetCode - C++ - 529. Minesweeper



題目:


解答:

class Solution {
public:
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        int m = board.size();
        int n = board[0].size();
        int x0 = click[0];
        int y0 = click[1];
        vector<pair<int, int>> dir = {
            { -1, -1 }, { -1, 0 }, { -1, 1 },
            {  0, -1 },            {  0, 1 },
            {  1, -1 }, {  1, 0 }, {  1, 1 }
        };

        if (board[x0][y0] == 'M') {
            board[x0][y0] = 'X';
            return board;
        }

        auto dfs = [&](this auto&& dfs, int x, int y) {
            if (x < 0 || x >= m || y < 0 || y >= n) {
                return;
            }

            if (board[x][y] != 'E') {
                return;
            }

            int mine = 0;
            for (auto& [dx, dy] : dir) {
                int nx = x + dx;
                int ny = y + dy;

                if (nx < 0 || nx >= m || ny < 0 || ny >= n) {
                    continue;
                }

                if (board[nx][ny] == 'M') {
                    mine += 1;
                }
            }

            if (mine > 0) {
                board[x][y] = mine + '0';
                return;
            }

            board[x][y] = 'B';
            for (auto& [dx, dy] : dir) {
                dfs(x + dx, y + dy);
            }
        };

        dfs(x0, y0);

        return board;
    }
};