直接按照题目的意思,翻译成的递归算法:
class Solution {
public:
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
int x = click[0], y = click[1];
if(board[x][y]=='M'){
board[x][y]='X';
return board;
}else if(board[x][y]=='E'){
int count = 0;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
int a = x + i, b = y+j;
if(a>=0&&a<board.size()&&b>=0&&b<board[0].size()&&board[a][b]=='M') count++;
}
}
if(count>0){
board[x][y] = '0'+count;
return board;
}else{
board[x][y] = 'B';
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
int a = x +i, b= y+j;
vector<int> tmp{a,b};
if(a>=0&&a<board.size()&&b>=0&&b<board[0].size()&&board[a][b]=='E') {
updateBoard(board,tmp);
}
}
}
}
}
return board;
}
};
可以做优化,将逻辑拆开,这样速度更快
const int direction[][2] = {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
class Solution {
public:
void dfs(vector<vector<char>>& board, int x, int y){
if(board[x][y]!='E') return;
int row = board.size(), col = board[0].size();
int count = 0;
for(auto i:direction){
int nx = x + i[0];
int ny = y + i[1];
if(nx>=0&&nx<row&&ny>=0&&ny<col&&board[nx][ny]=='M') count++;
}
if(count>0){
board[x][y] = '0' + count;
return;
}
board[x][y] = 'B';
for(auto i:direction){
int nx = x + i[0];
int ny = y + i[1];
if(nx>=0&&nx<row&&ny>=0&&ny<col){
dfs(board,nx,ny);
}
}
}
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
int x = click[0], y = click[1];
if(board[x][y]=='M'){
board[x][y] = 'X';
return board;
}
dfs(board,click[0],click[1]);
return board;
}
};