具体思想:
自己有点傻逼。。。
自己想的是先把雷四周未遍历的地方打上标记预处理,遍历后没有改变标记的就是不能处理的;
结果人家直接统计每个遍历块的周围有多少个雷,如果有的话写入数字不进行后续遍历;
正好避开不能遍历的几个块;
具体代码:
class Solution {
public:
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
int m=board.size();
int n=board[0].size();
int x=click[0];
int y=click[1];
if(board[x][y]=='M'){
board[x][y]='X';
return board;
}
if(board[x][y]=='E'){
prepocess(board,m,n);
dfs(board,m,n,x,y);
postpocess(board, m, n);
}
return board;
}
void dfs(vector<vector<char>>& board,int m,int n,int x,int y){
if(board[x][y]<'z'&&board[x][y]>'a'){
board[x][y]='0'+int(board[x][y]-'a');
return;
}
if(board[x][y]!='E')
return;
board[x][y]='B';
for(int k=0;k<8;k++){
int nx=x+dirs[k][0];
int ny=y+dirs[k][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n){
dfs(board,m,n,nx,ny);
}
}
}
void postpocess(vector<vector<char>>& board,int m,int n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='M'){
for(int k=0;k<8;k++){
int nx=i+dirs[k][0];
int ny=j+dirs[k][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n){
if(board[nx][ny]<'z'&&board[nx][ny]>'a'){
board[nx][ny]='E';
}
}
}
}
}
}
}
void prepocess(vector<vector<char>>& board,int m,int n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='M'){
for(int k=0;k<8;k++){
int nx=i+dirs[k][0];
int ny=j+dirs[k][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n){
if(board[nx][ny]=='E'){
board[nx][ny]='a'+1;
}else if(board[nx][ny]<'z'&&board[nx][ny]>'a'){
board[nx][ny]+=1;
}
}
}
}
}
}
}
vector<vector<int>>dirs={{1,0},{-1,0},{1,1},{-1,-1},{0,1},{0,-1},{-1,1},{1,-1}};
};