解题代码:
classSolution {
public:
boolin(vector<vector<char>>& board,int i,int j){
if(i>=0&&i<board.size()&&j>=0&&j<board[0].size())return true;
else return false;
}
voidcheck(vector<vector<char>>& board,int i,int j){
if(!in(board,i,j)) return;
if(board[i][j]=='E'){
int count=0;
if(in(board,i-1,j-1)&&board[i-1][j-1]=='M')
count++;
if(in(board,i-1,j)&&board[i-1][j]=='M')
count++;
if(in(board,i-1,j+1)&&board[i-1][j+1]=='M')
count++;
if(in(board,i,j-1)&&board[i][j-1]=='M')
count++;
if(in(board,i,j+1)&&board[i][j+1]=='M')
count++;
if(in(board,i+1,j-1)&&board[i+1][j-1]=='M')
count++;
if(in(board,i+1,j)&&board[i+1][j]=='M')
count++;
if(in(board,i+1,j+1)&&board[i+1][j+1]=='M')
count++;
if(count>0){
board[i][j]='0'+count;
}
else{
board[i][j]='B';
check(board,i-1,j-1);
check(board,i-1,j);
check(board,i-1,j+1);
check(board,i,j-1);
check(board,i,j+1);
check(board,i+1,j-1);
check(board,i+1,j);
check(board,i+1,j+1);
}
}
}
vector<vector<char>>updateBoard(vector<vector<char>>& board, vector<int>&click) {
if(board[click[0]][click[1]]=='M'){
board[click[0]][click[1]]='X';
return board;
}
check(board,click[0],click[1]);
return board;
}
};
解题思路:
本题主要是在模拟扫雷游戏中的过程,若选中雷,则结束游戏,若选中的格子没有雷,就判断选中的区域周围八个格子中是否有雷,若有,就显示周围雷的总数,若无,就要对它周围的八个格子都要尽心检查。因此可以使用递归的方法对格子进行检查。其中需要注意的地方主要有两个,一个是检查的格子是否在边界的位置,另一个是若某个格子已经被检测过,显示为‘B’,就不需要继续进行检测。