让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
如果答案让您满意,请采纳、关注,非常感谢!
### 问题分析
这个问题要求我们判断一个由0和1组成的矩阵,通过交换任意两行或两列,是否可以使得主对角线上的所有元素都为1。我们需要编写一个程序来解决这个问题。
关键点
- 主对角线:矩阵中从左上角到右下角的对角线。
- 交换行/列:可以通过交换行或列来改变矩阵的布局,但不会改变每行和每列中1的数量。
- 可行性判断:
- 如果某一行或某一列没有1,则无论如何交换都无法使主对角线全为1。
- 如果每一行和每一列都有1,并且1的数量足够覆盖主对角线,则可以通过适当的交换使得主对角线全为1。
解决方案
- 检查每一行和每一列是否有1:
- 检查1的数量是否足够:
- 如果每一行和每一列都有1,并且1的数量足够覆盖主对角线,则输出"Yes"。
代码实现
def can_make_diagonal_one(matrix):
n = len(matrix)
# 检查每一行和每一列是否有1
for i in range(n):
if sum(matrix[i]) == 0: # 检查行
return "No"
if sum(matrix[j][i] for j in range(n)) == 0: # 检查列
return "No"
# 检查1的数量是否足够
row_ones = [sum(matrix[i]) for i in range(n)]
col_ones = [sum(matrix[j][i] for j in range(n)) for i in range(n)]
if min(row_ones) < 1 or min(col_ones) < 1:
return "No"
return "Yes"
def solve():
import sys
input = sys.stdin.read
data = input().split()
index = 0
T = int(data[index])
index += 1
results = []
for _ in range(T):
N = int(data[index])
index += 1
matrix = []
for _ in range(N):
row = list(map(int, data[index].split()))
matrix.append(row)
index += 1
result = can_make_diagonal_one(matrix)
results.append(result)
for result in results:
print(result)
if __name__ == "__main__":
solve()
测试案例
输入
2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
输出
No
Yes
解释
-
对于第一组数据:
- 矩阵为:
0 0
0 1
- 第一行没有1,因此无法通过交换使得主对角线全为1,输出"No"。
-
对于第二组数据:
- 矩阵为:
0 0 1
0 1 0
1 0 0
- 每一行和每一列都有1,并且1的数量足够覆盖主对角线,可以通过交换使得主对角线全为1,输出"Yes"。
通过上述代码和测试案例,我们可以验证该解决方案的有效性。