leetcode529 (지뢰 찾기 게임 : 사진 검색)

게임 보드를 나타내는 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;
    }
}

추천

출처blog.csdn.net/CY2333333/article/details/108121011