Python程式:計算將所有單元格顏色變為相同的所需操作次數
假設我們有一個二維矩陣 M。每個單元格包含一個表示其顏色的值,並且具有相同顏色的相鄰單元格(上、下、左、右)需要組合在一起。現在,考慮一個操作,我們將一個組中的所有單元格設定為某種顏色。然後最終找到使每個單元格都具有相同顏色的所需的最少操作次數。當顏色發生轉換時,不能再次設定。
因此,如果輸入如下所示:
2 | 2 | 2 | 2 |
1 | 1 | 1 | 1 |
2 | 3 | 2 | 1 |
則輸出為 2,因為我們可以將顏色為 2 的組填充為 1,然後將 3 填充為 1。
為了解決這個問題,我們將遵循以下步驟:
如果矩陣為空,則
返回 0
定義一個函式 dfs()。它將接收 i、j、矩陣、val 作為引數
n := 矩陣的行數,m := 矩陣的列數
如果 i < 0 或 i > n - 1 或 j < 0 或 j > m - 1,則
返回
如果 matrix[i, j] 與 -1 相同,則
返回
如果 matrix[i, j] 與 val 相同,則
matrix[i, j] := -1
dfs(i, j + 1, matrix, val)
dfs(i + 1, j, matrix, val)
dfs(i, j - 1, matrix, val)
dfs(i - 1, j, matrix, val)
否則,
返回
從主方法中執行以下操作:
n := 矩陣的行數,m := 矩陣的列數
d := 空對映
對於 i 的範圍從 0 到 n-1,執行
對於 j 的範圍從 0 到 m-1,執行
val := matrix[i, j]
如果 val 與 -1 不相同,則
d[val] := d[val] + 1
dfs(i, j, matrix, val)
根據其值對字典元素 f 進行排序
safe := l 的最後一個元素
res := 0
對於 d 的每個鍵值對 k 和 v,執行
如果 k 與 safe 不相同,則
res := res + v
返回 res
讓我們檢視以下實現以更好地理解:
示例
from collections import defaultdict class Solution: def solve(self, matrix): if not matrix: return 0 def dfs(i, j, matrix, val): n, m = len(matrix), len(matrix[0]) if i < 0 or i > n - 1 or j < 0 or j > m - 1: return if matrix[i][j] == -1: return if matrix[i][j] == val: matrix[i][j] = -1 dfs(i, j + 1, matrix, val) dfs(i + 1, j, matrix, val) dfs(i, j - 1, matrix, val) dfs(i - 1, j, matrix, val) else: return n, m = len(matrix), len(matrix[0]) d = defaultdict(int) for i in range(n): for j in range(m): val = matrix[i][j] if val != -1: d[val] += 1 dfs(i, j, matrix, val) l = sorted(d,key=lambda x: d[x]) safe = l[-1] res = 0 for k, v in d.items(): if k != safe: res += v return res ob = Solution() matrix = [ [2, 2, 2, 2], [1, 1, 1, 1], [2, 3, 2, 1] ] print(ob.solve(matrix))
輸入
matrix = [[2, 2, 2, 2],[1, 1, 1, 1],[2, 3, 2, 1]]
輸出
2