LeetCode529。マインスイーパのpython3 DFS + BFS +ノート

https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/は
ルール:

  • 「M」を非掘る鉱山を表し、
  • 「X」は、鉱山は掘り込みアップされていることを示しています。
  • 「E」が空箱から出して掘るません表し、
  • 「B」は、(上、下、左、右、およびすべての4つの対角)鉱山ボックスを空白の掘られている隣接の代表ではありません
  • デジタル(「1」「8」に)、このネイバーとボックスの掘られているどのように多くの鉱山を示します

境界条件:

  • 内のすべての今、以下の規則、クリックパネルに対応するそれぞれの戻り位置に応じてクリック位置(行と列のインデックス)で掘削ボックス(「M」または「E」)を、与えられました:
  • 鉱山(「M」)が掘り起こされた場合、ゲームオーバーです - 「X」に変更し、それを。
  • 隣接鉱山空の正方形(「E」)が出土した場合、それは(「B」)を修飾、及びその隣接ブロックの全て、再帰的に開示されるべきであるれます。
  • 少なくとも一つの隣接する白四角(「E」)と地雷が掘削されている場合、デジタルに変更し(「1」から「8」)、隣接する地雷の数を表します。
  • あなたは、より多くのブロックが存在しないことが明らかにすることができる。この上でクリックすると、パネルが返されます。

クリックは、「M」である場合、そのボードへの出口、復帰へのXへの地雷セット上のステップです。
あなたはDFSとBFSにされていない場合

  • DFSない場合は最初の境界条件E'return。残りは行われ、200件の島々を、DFSのように、しかし、ここ8つの接続されています
class SolutionDFS:
    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
        if not board:
            return []
        m,n=len(board),len(board[0])
        i,j=click[0],click[1]
        if board[i][j] == 'M':
            board[i][j] = 'X'
            return board
        self.dfs(board,i,j)
        return board
    
    def dfs(self,board,i,j):
        if board[i][j] != 'E':
            return
        m,n=len(board),len(board[0])
        directions = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)]
        mine_count = 0
        for d in directions:
            ni,nj=i+d[0],j+d[1]
            if 0<=ni<m and 0<=nj<n and board[ni][nj]=='M':
                mine_count+=1
        if mine_count == 0:
            board[i][j] = 'B'
        else:
            board[i][j] = str(mine_count)
            return
        
        for d in directions:
            ni,nj=i+d[0],j+d[1]
            if 0 <= ni <m and 0<=nj<n:
                self.dfs(board,ni,nj)
  • BFS:BFSのアイデアは、キューマーカーボードに横断していないテンプレートとして使用することができますが、終了後の場所を訪問しました
class SolutionBFS:
    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
        m,n=len(board),len(board[0])
        i,j=click[0],click[1]
        if board[i][j] == "M":
            board[i][j] = "X"
        directions = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)]
        import collections
        q = collections.deque()
        q.append(click)
        visited = set(click)
        
        def numBombs(board,i,j):
            mine_count = 0
            for d in directions:
                ni, nj = i + d[0], j + d[1]
                if 0<=ni<m and 0<=nj<n and board[ni][nj] == 'M':
                    mine_count+=1
            return mine_count
        while q:
            for _ in range(len(q)):
                x,y=q.popleft()
                if board[x][y] == 'E':
                    bombsNextTo = numBombs(board,x,y)
                    board[x][y] = "B" if bombsNextTo == 0 else str(bombsNextTo)
                    if bombsNextTo == 0:
                        for d in directions:
                            ni, nj = x + d[0], y + d[1]
                            if 0<=ni<m and 0<=nj<n and (ni,nj) not in visited:
                                q.append((ni,nj))
                                visited.add((ni,nj))
        return board

おすすめ

転載: www.cnblogs.com/buro79xxd/p/12076414.html