ゲームボードを表す2次元のキャラクターマトリックスが与えられます。「M」は未使用の地雷を表し、「E」は掘られていない空の広場を表し、「B」は隣接していない地雷(上、下、左、右、すべての4つの対角線)を表します。掘り出された空白の正方形の場合、数字(「1」から「8」)はこの掘り込みブロックに隣接する鉱山の数を示し、「X」は掘り出された鉱山を意味します。
次に、次のルールに従って、掘られていないすべての正方形(「M」または「E」)の次のクリック位置(行と列のインデックス)を指定し、対応する位置をクリックした後に対応するパネルに戻ります。
1.地雷(「M」)が掘り出された場合、ゲームは「X」に変更されます。
2.隣接する地雷のない空の正方形( 'E')が掘り出された場合は、それを( 'B')に変更し、隣接するすべての3.掘られていない正方形を再帰的に公開します。
4.少なくとも1つの地雷に隣接する空の正方形( '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;
}
}