题目
扫雷游戏
class Solution {
int[] dirX = {0, 1, 0, -1, 1, 1, -1, -1};
int[] dirY = {1, 0, -1, 0, 1, -1, 1, -1};
public char[][] updateBoard(char[][] board, int[] click) {
int m=board.length;
int n=board[0].length;
int x=click[0];
int y=click[1];
if(board[x][y]=='M'){
board[x][y]='X';
return board;
}
// dfs(board,m,n,x,y);
bfs(board,m,n,x,y);
return board;
}
public void bfs(char[][] board, int m,int n,int i, int j) {
Queue<int []>queue=new LinkedList<int []>();
boolean [][]visit=new boolean[m][n];
queue.offer(new int[]{i,j});
visit[i][j]=true;
while(!queue.isEmpty()){
int []pos=queue.poll();
int cnt=0;
int x=pos[0];
int y=pos[1];
for(int k=0;k<8;k++){
int dx=x+dirX[k];
int dy=y+dirY[k];
if(dx<0||dx>=m||dy<0||dy>=n)continue;
if(board[dx][dy]=='M')cnt++;
}
if(cnt==0){
board[x][y]='B';
for(int k=0;k<8;k++){
int dx=x+dirX[k];
int dy=y+dirY[k];
if(dx<0||dx>=m||dy<0||dy>=n||board[dx][dy]!='E'||visit[dx][dy])continue;
queue.offer(new int[]{dx,dy});
visit[dx][dy]=true;
}
}else{
board[x][y]=(char)(cnt+'0');
}
}
}
public void dfs(char[][] board, int m,int n,int i, int j) {
if(i<0||i>=m||j<0||j>=n||board[i][j]!='E')return;
int cnt=0;
for(int k=0;k<8;k++){
int x=i+dirX[k];
int y=j+dirY[k];
if(x<0||x>=m||y<0||y>=n)continue;
if(board[x][y]=='M')cnt++;
}
if(cnt==0){
board[i][j]='B';
for(int k=0;k<8;k++){
int x=i+dirX[k];
int y=j+dirY[k];
dfs(board,m,n,x,y);
}
}else{
board[i][j]=(char)(cnt+'0');
}
return;
}
}