给定一个 N 行 M 列的二维矩阵,矩阵中每个位置的数字取值为 0 或 1。矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0,规则如下: 1)当点击一个 1 时,该 1 变被反转为 0,同时相邻的上、下、左、右,以及左上、左下、右 上、右下 8 个方向的 1(如果存在 1)均会自动反转为 0; 2)进一步地,一个位置上的 1 被反转为 0 时,与其相邻的 8 个方向的 1(如果存在 1)均会自 动反转为 0; 按照上述规则示例中的矩阵只最少需要点击 2 次后,所有值均为 0。请问,给定一个矩阵, 最少需要点击几次后,所有数字均为 0? 输入描述 第一行为两个整数,分别表示矩阵的行数 N 和列数 M,取值范围均为[1, 100] 接下来 N 行表示矩阵的初始值,每行均为 M 个数,取值范围[0,1] 输出描述 输出一个整数,表示最少需要点击的次数
时间: 2024-02-24 17:59:57 浏览: 113
以下是一个可能的Python实现,时间复杂度为$O(nm)$:
```python
n, m = map(int, input().split())
# 读入矩阵,同时记录所有为1的位置
matrix = []
ones = set()
for i in range(n):
row = list(map(int, input().split()))
matrix.append(row)
for j in range(m):
if row[j] == 1:
ones.add((i, j))
# BFS搜索相邻的1,并将其设为0
def bfs(i, j):
q = [(i, j)]
while q:
x, y = q.pop(0)
if matrix[x][y] == 0:
continue
matrix[x][y] = 0
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0), (-1, -1), (-1, 1), (1, -1), (1, 1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 1:
q.append((nx, ny))
# 对每个为1的位置进行BFS搜索,并记录点击次数
clicks = 0
while ones:
i, j = ones.pop()
bfs(i, j)
clicks += 1
# 输出结果
print(clicks)
```
这个方法的思路是先读入矩阵,并记录所有为1的位置。然后对于每个为1的位置,进行BFS搜索相邻的1,并将其设为0。搜索结束后,将点击次数加1。最终的点击次数即为所有为1的位置进行BFS搜索的次数。
阅读全文