Это интересная проблема BFS. Немного сложнее обычных, однако решение все равно очень стандартное.
Проблема в последнем конкурсе на этой неделе. Кажется, Leetcode снижает уровень сложности конкурса, чтобы отпраздновать Рождество (только мое предположение). Более 700 человек успешно решили все 4 вопроса конкурса.
1284. Минимальное количество переворотов для преобразования бинарной матрицы в нулевую матрицу
Время выполнения составляет 40 мс.
from collections import deque class Solution: def minFlips(self, A: List[List[int]]) -> int: R, C = len(A), len(A[0]) a = [str(A[i][j]) for i in range(R) for j in range(C)] a = ''.join(a) if a == '0'*(R*C):return 0 def bfs(a): flip = {'0':'1', '1':'0'} open_list = deque([(a, 0)]) seen = {a} while open_list: state, d = open_list.popleft() for i in range(R): for j in range(C): valids = [(i+di, j+dj) for di, dj in [(0, 1),(0, -1),(1, 0),(-1, 0)] if 0<=i+di<R and 0<=j+dj<C] state_l = list(state) for ii, jj in valids+[(i, j)]: idx = C*ii + jj state_l[idx] = flip[state_l[idx]] state_new = ''.join(state_l) if state_new == '0'*(R*C):return d+1 if state_new not in seen: seen.add(state_new) open_list.append((state_new, d+1)) return -1 return bfs(a)
Спасибо.