게임 보드를 나타내는 2 차원 캐릭터 매트릭스가 주어집니다. 'M'은 undug mine, 'E'는 파지 않은 빈 사각형, 'B'는 인접하지 않은 광산 (상하 좌우, 대각선 4 개 모두)을 의미합니다. 파낸 빈 사각형의 경우 숫자 ( '1'~ '8')는이 파기 블록에 인접한 지뢰 수를 나타내며 'X'는 파낸 지뢰를 의미합니다.
이제 다음 규칙에 따라 파지되지 않은 모든 사각형 ( 'M'또는 'E')에서 다음 클릭 위치 (행 및 열 인덱스)를 지정하고 해당 위치를 클릭 한 후 해당 패널로 돌아갑니다.
1. 지뢰 ( 'M')를 파 내면 게임이 'X'로 오버 체인지됩니다.
2. 인접한 지뢰가없는 빈 사각형 ( 'E')을 파 내면 ( 'B')로 수정하면 3. 인접한 모든 파기 사각형이 반복적으로 노출되어야합니다.
4. 적어도 하나의 지뢰에 인접한 빈 사각형 ( 'E')을 파 내면 인접한 지뢰의 수를 나타내는 숫자 ( '1'에서 '8')로 수정합니다.
5.이 클릭 중에 더 이상 표시 할 사각형이 없으면 패널로 돌아갑니다.
시작하다:
[[ 'E', 'E', 'E', 'E', 'E'],
[ 'E', 'E', 'M', 'E', 'E'],
[ 'E', 'E', 'E', 'E', 'E'],
[ 'E', 'E', 'E', 'E', 'E']]
클릭 : [3,0]
산출:
[[ 'B', '1', 'E', '1', 'B'],
[ 'B', '1', 'M', '1', 'B'],
[ 'B', '1', '1', '1', 'B'],
[ 'B', 'B', 'B', 'B', 'B']]
문제 해결 : 기존의 그래프 검색 문제는 브레인리스 재귀 DFS로 직접 해결할 수 있습니다.
class Solution {
public char[][] updateBoard(char[][] board, int[] click) {
if(click[0]<0||click[0]>=board.length||click[1]<0||click[1]>=board[0].length)
return board;
if(board[click[0]][click[1]]=='M')
board[click[0]][click[1]]='X';
else{
//search数组用于存储点的状态,来判断该点是否被搜索过
boolean[][]search=new boolean[board.length][board[0].length];
move(board,click[0],click[1],search);
}
return board;
}
private void move(char[][]board,int x,int y,boolean[][]search){
if(!(x>=0&&x< board.length&&y>=0&&y<board[0].length))
return;
if(search[x][y])
return;
else{
search[x][y]=true;
if(board[x][y]!='E')
return;
}
//计算周围的地雷数
int numOfM=check(x,y+1,board)+check(x,y-1,board)+check(x-1,y,board)+
check(x+1,y,board)+check(x+1,y+1,board)+check(x-1,y+1,board)+
check(x+1,y-1,board)+check(x-1,y-1,board);
if(numOfM!=0)
board[x][y]=Integer.toString(numOfM).charAt(0);
else{
board[x][y]='B';
//递归推进搜索
move(board,x+1,y,search);
move(board,x-1,y,search);
move(board,x,y+1,search);
move(board,x,y-1,search);
move(board,x+1,y-1,search);
move(board,x-1,y-1,search);
move(board,x+1,y+1,search);
move(board,x-1,y+1,search);
}
}
//判断该点是否有地雷
private int check(int x,int y,char[][]board){
if(x>=0&&x< board.length&&y>=0&&y<board[0].length){
if(board[x][y]=='M')
return 1;
else
return 0;
}
else
return 0;
}
}