(M)DFS:529. Minesweeper

扫雷游戏。

给定2维字符矩阵board,'M'表示未挖到的地雷,'E'表示未挖到的空地。'B'表示已经挖到的、四周(上下左右以及对角线)没有地雷的空地。数字'1'到'8'表示四周包含相应数字的地雷,'X'表示挖到地雷。

给定下一次鼠标点击的位置(只在'M'或者'E'处点击),根据如下规则返回点击之后的board:

如果挖到'M',则将其变成'X',游戏结束

如果挖到四周没有地雷的'E',将其变成'B',并递归地挖开其相邻无雷区域

如果挖到四周包含地雷的'E',将其替换为四周地雷的数目

做法:

首先判断点击的这个位置是否是M,如果是的话直接变成X。

如果这个位置是E,遍历这个位置周围的八个位置,计算这八个位置中M的个数cnt。如果cnt不为0,直接把cnt变成字符填入,如果cnt为0,对这个位置周围的八个位置递归调用此函数。

class Solution {
public:
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        if (board.empty() || board[0].empty()) return {};
        int x = click[0];
        int y = click[1];
        if(board[x][y] == 'M')
            board[x][y] = 'X';
        else
        {
            int m = 0, n = 0, cnt = 0;
            for(int i = -1; i < 2; ++i)
            {
                for(int j = -1; j < 2; ++j)
                {
                    if(x + i < 0 || x + i >= board.size() || y+j < 0 || y+j >= board[0].size()) continue;
                    m = x+i;
                    n = y+j;
                    if(board[m][n] == 'M') cnt++;
                }
            }
            if(cnt > 0) board[x][y] = '0' + cnt;
            else  //cnt == 0
            {
                board[x][y] = 'B';
                for(int i = -1; i < 2; ++i)
                {
                    for(int j = -1; j < 2; ++j)
                    {
                        if(x+i < 0 || x+i >= board.size() || y+j < 0 || y+j >= board[0].size()) continue;
                        if(board[x+i][y+j] == 'E')
                        {
                            vector<int> c{x+i, y+j};
                            updateBoard(board, c);
                        }
                    }
                }
            }
            
        }
        return board;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值