leetcode529(マインスイーパゲーム:写真の検索)

ゲームボードを表す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;
    }
}

おすすめ

転載: blog.csdn.net/CY2333333/article/details/108121011