📅  最后修改于: 2023-12-03 15:12:35.022000             🧑  作者: Mango
本次介绍是GATE 2017 MOCK II的第38章,主要涉及编程方面的题目。以下是本次介绍的内容:
给定一个M*N的矩阵,矩阵中的每一个元素均为1或0。现在你需要将矩阵中的一部分元素从1改为0,使得你最终得到的矩阵中每一行和每一列至少有一个0。
第一行包含两个整数M和N,表示该矩阵的行数和列数。
接下来M行,每行包含N个01数字,分别表示该矩阵中的元素。
输出一个整数,表示最少需要改变多少个1才能达到题目所述的要求。
根据题目描述,我们需要将一部分元素从1改为0。题目要求每一行和每一列至少有一个0,那么可以得出以下两个结论:
那么我们可以利用这两个结论,对矩阵进行遍历。对于每一行和每一列,如果其中有一个元素为1,且该行或该列仅有这一个元素为1,则将该1改为0,然后继续遍历。最后统计改变的1的数量即可。
该算法需要遍历整个矩阵,因此时间复杂度为O(M*N)。
def min_changes(matrix, M, N):
res = 0
# 检查矩阵每一行和每一列是否均有一个0
rows = [False] * M
cols = [False] * N
for i in range(M):
for j in range(N):
if matrix[i][j] == 0:
rows[i] = True
cols[j] = True
# 对每一行和每一列进行遍历
for i in range(M):
for j in range(N):
# 如果该行或该列中有一个元素为1,且该行或该列中仅有这一个元素为1,则将该1改为0
if matrix[i][j] == 1 and (not rows[i] or not cols[j]):
matrix[i][j] = 0
rows[i] = True
cols[j] = True
res += 1
return res
if __name__ == '__main__':
M, N = map(int, input().split())
matrix = []
for i in range(M):
row = list(map(int, input().split()))
matrix.append(row)
print(min_changes(matrix, M, N))
以上就是本次介绍的内容,希望对大家有所帮助!