题目
知识点
思路
- DFS常规题,读明白题目意思就好。
- 条件1遍历到直接改为’X’,Game over! - Line 9-11
- 条件2需要递归进行DFS搜索(Line 24-29),之所以样例中雷的上面一块没有从‘E‘->’1‘是因为周围一圈数字围起来了,而条件3所说,周围存在雷则修改为数字然后结束递归(Line 20-22),所以那个位置是是无法搜索到的。
- 注意看周围有没有雷(Line 14-19)的时候不是“上下左右”4个位置,这道题斜的也需要搜索,需要8个位置
int dr[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dc[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
代码
class Solution {
public:
int r_max, c_max;
int dr[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dc[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
void dfs(vector<vector<char>> &status, vector<int> &pos) {
char p = status[pos[0]][pos[1]];
if (p == 'M') {
status[pos[0]][pos[1]] = 'X';
return;
} else {
int num_mine = 0;
for (int i = 0; i < 8; i++) {
int r_new = pos[0] + dr[i], c_new = pos[1] + dc[i];
if (r_new >= 0 && r_new < r_max && c_new >= 0 && c_new < c_max) {
if (status[r_new][c_new] == 'M') num_mine++;
}
}
if (num_mine != 0) {
status[pos[0]][pos[1]] = num_mine + 48;
return;
} else {
status[pos[0]][pos[1]] = 'B';
for (int i = 0; i < 8; i++) {
int r_new = pos[0] + dr[i], c_new = pos[1] + dc[i];
if (r_new >= 0 && r_new < r_max && c_new >= 0 && c_new < c_max && status[r_new][c_new] == 'E') {
vector<int> t = {r_new, c_new};
dfs(status, t);
}
}
}
return;
}
}
vector<vector<char>> updateBoard(vector<vector<char>> &board, vector<int> &click) {
r_max = board.size(), c_max = board[0].size();
dfs(board, click);
return board;
}
};