[深度优先搜索] leetcode 529 Minesweeper

problem:https://leetcode.com/problems/minesweeper/

        一道扫雷的题目,直接模拟就好了,主要是要理清楚扫雷的一些规则(比如八方向搜索)。对于空白的格子,需要先判断一下周围有没有雷,有雷就停止搜索。

        不需要维护额外的visit数组,可以直接修改原矩阵的值来作为访问标记。

class Solution {
public:
  //  vector<vector<char>> res;
    vector<int> dx { 0,1,0,-1,1,1,-1,-1 };
    vector<int> dy { 1,0,-1,0,1,-1,1,-1 };
    
    bool fill(vector<vector<char>>& board, int i, int j)
    {
        int count = 0;
        for(int k = 0; k < 8; k++)
        {
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && y >= 0 && x < board.size() && y < board[0].size())
            {
                if(board[x][y] == 'M')
                {
                    count++;
                }
            }
        }
        if(count != 0)
        {
            board[i][j] = count + '0';
            return false;
        }
        board[i][j] = 'B';
        return true;
    }
    void dfs(vector<vector<char>>& board, int i, int j)
    {
        if(board[i][j] == 'M')
        {
            board[i][j] = 'X';            
            return;
        }
        if(!fill(board, i, j))
        {
            return;
        }
        for(int k = 0; k < 8; k++)
        {
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && y >= 0 && x < board.size() && y < board[0].size())
            {
                if(board[x][y] == 'E')
                {
                    dfs(board, x, y);
                }
            }
        }
    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        dfs(board, click[0], click[1]);
        return board;
    }
};

 

posted @ 2019-07-29 22:07  fish1996  阅读(145)  评论(0)    收藏  举报