[深度优先搜索] 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; } };

浙公网安备 33010602011771号