Giả sử chúng ta có một ma trận 2d. Chúng ta phải kiểm tra xem chúng ta có thể bắt đầu từ một ô nào đó, sau đó di chuyển các ô liền kề (lên, xuống, trái, phải) có cùng giá trị và quay lại cùng điểm bắt đầu hay không. Chúng tôi không thể truy cập lại ô mà chúng tôi đã truy cập lần trước.
Vì vậy, nếu đầu vào giống như
2 | 2 | 2 | 1 |
2 | 1 | 2 | 1 |
2 | 2 | 2 | 1 |
thì đầu ra sẽ là True, vì chúng ta có thể làm theo 2 giây để tạo thành một chu kỳ.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- R:=số hàng của ma trận
- C:=số cột của ma trận
- vis:=tạo một ma trận có kích thước R x C và điền vào False
- Định nghĩa một hàm dfs (). Điều này sẽ bén rễ
- stack:=một ngăn xếp có hai phần tử gốc và null
- vis [root [0], root [1]]:=True
- trong khi ngăn xếp không trống, hãy thực hiện
- [v, prev]:=phần tử trên cùng của ngăn xếp và bật ra từ ngăn xếp
- đối với mỗi người hàng xóm w của v, thực hiện
- nếu w không giống như trước, thì
- nếu vis [w [0], w [1]] là false thì
- vis [w [0], w [1]]:=True
- đẩy [w, v] vào ngăn xếp
- nếu vis [w [0], w [1]] là false thì
- nếu không,
- trả về True
- nếu w không giống như trước, thì
- trả về Sai
- Từ phương thức chính, hãy làm như sau:
- đối với tôi trong phạm vi từ 0 đến R - 1, thực hiện
- đối với j trong phạm vi từ 0 đến C - 1, thực hiện
- nếu vis [i, j] là false, thì
- nếu dfs ((i, j)) là true, thì
- trả về True
- nếu dfs ((i, j)) là true, thì
- nếu vis [i, j] là false, thì
- đối với j trong phạm vi từ 0 đến C - 1, thực hiện
- trả về Sai
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
class Solution: def solve(self, matrix): R = len(matrix) C = len(matrix[0]) def get_neighbors(i, j): val = matrix[i][j] for ii, jj in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)): if 0 <= ii < R and 0 <= jj < C and matrix[ii][jj] == val: yield ii, jj vis = [[False] * C for _ in range(R)] def dfs(root): stack = [(root, None)] vis[root[0]][root[1]] = True while stack: v, prev = stack.pop() for w in get_neighbors(*v): if w != prev: if not vis[w[0]][w[1]]: vis[w[0]][w[1]] = True stack.append((w, v)) else: return True return False for i in range(R): for j in range(C): if not vis[i][j]: if dfs((i, j)): return True return False ob = Solution() matrix = [ [2, 2, 2, 1], [2, 1, 2, 1], [2, 2, 2, 1] ] print(ob.solve(matrix))
Đầu vào
[ [2, 2, 2, 1], [2, 1, 2, 1], [2, 2, 2, 1] ]
Đầu ra
True