[leetcode] 529. Minesweeper @ python

版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/86607795

原题

https://leetcode.com/problems/minesweeper/

解法

DFS. Base case是board为空时, 返回[]. 定义DFS函数, base case是当前位置的值不是’E’, 直接返回. 我们先计算click位置的相邻位置有多少个’M’, 将click位置更新, 注意: 如果click位置更新的是数字的话, 我们就不再对它相邻的’E’进行reveal, 直接return. 如果click位置更新的是’B’的话, 我们用DFS进行递归.

代码

class Solution:
    def updateBoard(self, board, click):
        """
        :type board: List[List[str]]
        :type click: List[int]
        :rtype: List[List[str]]
        """ 
        # base case:
        if not board: 
            return []        
        
        x, y = click[0], click[1]
        # If a mine ('M') is revealed, then the game is over 
        if board[x][y] == 'M':
            board[x][y] = 'X'
            return board
        # keep revealing the board unitl no more squares will be revealed
        self.dfs(board, x, y)
        return board
        
    def dfs(self, board, x, y):        
        # edge case
        if board[x][y] != 'E':
            return
        row, col = len(board), len(board[0])
        directions = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)]
        count = 0
        for (dx, dy) in directions:
            if 0 <= x+dx < row and 0 <= y+dy < col and board[x+dx][y+dy] == 'M':
                count += 1
        if count == 0:
            board[x][y] = 'B'
        else:
            board[x][y] = str(count)
            return 
            
        for dx, dy in directions:
            if 0 <= x+dx < row and 0 <= y+dy < col:
                self.dfs(board, x+dx, y+dy)
                

猜你喜欢

转载自blog.csdn.net/danspace1/article/details/86607795