算法題--在二維矩陣中將所有被字母X包圍的非邊界O修改為X

image.png

0. 鏈接

題目鏈接

1. 題目

Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

Example:

X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

Explanation:

Surrounded regions shouldn’t be on the border, which means that any 'O' on the border of the board are not flipped to 'X'. Any 'O' that is not on the border and it is not connected to an 'O' on the border will be flipped to 'X'. Two cells are connected if they are adjacent cells connected horizontally or vertically.

2. 思路1: 遞歸

  1. 基本思路是:
  • 先從四個邊界線上的元素作為起點, 將所有的O修改為A, 遞歸的將其鄰居節(jié)點、鄰居的鄰居節(jié)點O修改為A
  • 再將所有的A轉(zhuǎn)換為X
  1. 分析:
  • 過程中, 每個元素都被訪問2次
  1. 復(fù)雜度
  • 時間復(fù)雜度 O(M*N)
  • 空間復(fù)雜度 O(1)

3. 代碼

# coding:utf8
from typing import List


class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        if len(board) == 0:
            return

        m = len(board)
        n = len(board[0])

        def to_alive(i, j):
            if board[i][j] == 'O':
                board[i][j] = 'A'
                if i > 0:
                    to_alive(i - 1, j)
                if i < m - 1:
                    to_alive(i + 1, j)
                if j > 0:
                    to_alive(i, j - 1)
                if j < n - 1:
                    to_alive(i, j + 1)

        for i in range(m):
            to_alive(i, 0)
            if n > 1:
                to_alive(i, n - 1)
        for j in range(1, n - 1):
            to_alive(0, j)
            if m > 1:
                to_alive(m - 1, j)

        for i in range(m):
            for j in range(n):
                if board[i][j] == 'A':
                    board[i][j] = 'O'
                elif board[i][j] == 'O':
                    board[i][j] = 'X'


def print_board(board):
    print('[')
    for each in board:
        print('\t{}'.format(each))
    print(']')


def my_test(solution, board):
    print('input:')
    print_board(board)
    solution.solve(board)
    print_board(board)


solution = Solution()

my_test(solution, [
    ['X', 'X', 'X', 'X'],
    ['X', 'O', 'O', 'X'],
    ['X', 'X', 'O', 'X'],
    ['X', 'O', 'X', 'X']
])
my_test(solution, [
    ['X', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'X', 'O'],
    ['X', 'O', 'O', 'X', 'X', 'X', 'O', 'O', 'O', 'X'],
    ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'X', 'X'],
    ['O', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'O', 'X'],
    ['O', 'O', 'X', 'X', 'O', 'X', 'X', 'O', 'O', 'O'],
    ['X', 'O', 'O', 'X', 'X', 'X', 'O', 'X', 'X', 'O'],
    ['X', 'O', 'X', 'O', 'O', 'X', 'X', 'O', 'X', 'O'],
    ['X', 'X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'X'],
    ['O', 'O', 'O', 'O', 'X', 'O', 'X', 'O', 'X', 'O'],
    ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'O', 'O', 'O']
])


輸出結(jié)果

input:
[
    ['X', 'X', 'X', 'X']
    ['X', 'O', 'O', 'X']
    ['X', 'X', 'O', 'X']
    ['X', 'O', 'X', 'X']
]
[
    ['X', 'X', 'X', 'X']
    ['X', 'X', 'X', 'X']
    ['X', 'X', 'X', 'X']
    ['X', 'O', 'X', 'X']
]
input:
[
    ['X', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'X', 'O']
    ['X', 'O', 'O', 'X', 'X', 'X', 'O', 'O', 'O', 'X']
    ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'X', 'X']
    ['O', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'O', 'X']
    ['O', 'O', 'X', 'X', 'O', 'X', 'X', 'O', 'O', 'O']
    ['X', 'O', 'O', 'X', 'X', 'X', 'O', 'X', 'X', 'O']
    ['X', 'O', 'X', 'O', 'O', 'X', 'X', 'O', 'X', 'O']
    ['X', 'X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'X']
    ['O', 'O', 'O', 'O', 'X', 'O', 'X', 'O', 'X', 'O']
    ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'O', 'O', 'O']
]
[
    ['X', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'X', 'O']
    ['X', 'O', 'O', 'X', 'X', 'X', 'O', 'O', 'O', 'X']
    ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'X', 'X']
    ['O', 'O', 'O', 'O', 'O', 'O', 'X', 'O', 'O', 'X']
    ['O', 'O', 'X', 'X', 'O', 'X', 'X', 'O', 'O', 'O']
    ['X', 'O', 'O', 'X', 'X', 'X', 'X', 'X', 'X', 'O']
    ['X', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'X', 'O']
    ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'O', 'O', 'X']
    ['O', 'O', 'O', 'O', 'X', 'X', 'X', 'O', 'X', 'O']
    ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'O', 'O', 'O']
]

4. 結(jié)果

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容