LeetCode529. 扫雷游戏




直接按照题意进行深度优先搜索,只要当前位置不是地雷,且周围还存在方块可以揭露(搜索)时,就继续搜索,否则停止搜索,返回面板(board)。

(1)如果搜到当前位置是地雷,那就修改为’X’。

(2)用一个int变量cnt记录周围8个位置的地雷数量。
(i)如果cnt不为0,说明周围有地雷,用对应的数字字符更新这个位置。
(ii)如果cnt为0,说明当前位置是一个空白方块,则从这个空白方块周围八个位置继续往下揭露(搜索)。

当莫得方块可以继续揭露时,返回面板。

代码如下:

class Solution {
public:
    int n, m;
    int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    vector<vector<bool>> visited;

    bool dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, int x, int y) {            // dfs的返回值表示从坐标(x,y)的格子能否继续往下揭露格子
        visited[x][y] = true;
        if(board[x][y] == 'M') {            // 找到一个地雷,更新当前位置为'X'
            board[x][y] = 'X';
            return true;
        }
        int cnt = 0;                        // cnt记录(x,y)周围的地雷数量
        for(int i = 0; i < 8; ++i) {
            int newX = x + dx[i];
            int newY = y + dy[i];
            if(newX >= 0 && newX < n && newY >= 0 && newY < m && board[newX][newY] == 'M') {
                ++cnt;
            }
        }
        if(cnt > 0) {                        // 如果周围有地雷,这将当前位置修改为地雷数量
            board[x][y] = '0' + cnt;
        } else {
            board[x][y] = 'B';                // 题目说了如果挖出一个空白方块被挖出,则需要递归地揭露与其相邻的方块
            for(int i = 0; i < 8; ++i) {
                int newX = x + dx[i];
                int newY = y + dy[i];
                if(newX >= 0 && newX < n && newY >= 0 && newY < m && visited[newX][newY] == false && dfs(board, visited, newX, newY) == true) {
                    return true;
                }
            }
        }
        return false;            
    }

    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        n = board.size();
        m = board[0].size();
        visited = vector<vector<bool>>(n, vector<bool>(m, false));
        dfs(board, visited, click[0], click[1]);
        return board;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值