求矩阵鞍点个数

本文介绍了一种基于矩阵的寻优算法,该算法通过比较每一行的最大值与每一列的最小值来寻找最优解,适用于解决特定类型的优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def judge(num):
    ls1 = []
    count = 0
    for i in range(num):
        ls1.append(list(map(int, input().split())))
    for i in range(num):
        row_max = max(ls1[i])
        for j in range(num):
            col_min = min([ls1[k][j] for k in range(num)])
            if row_max == ls1[i][j] and col_min == ls1[i][j]:
                count += 1
    return count


n = int(input())
print(judge(n))

### 矩阵鞍点算法实现与计算方法 矩阵鞍点的定义为:在一个矩阵中,如果某个元素是其所在行的最小值,并且是其所在列的最大值,则称该元素为矩阵鞍点。需要注意的是,一个矩阵可能不存在鞍点,也可能存在多个鞍点。 以下是一个基于引用内容和专业知识实现的矩阵鞍点查找算法: #### 算法描述 1. 遍历矩阵的每一行,找到每行的最小值及其对应的列索引。 2. 对于每个行最小值,检查它是否是其对应列的最大值。 3. 如果满足条件,则记录该元素的位置作为鞍点。 4. 最后输出所有鞍点的位置或说明不存在鞍点。 #### 代码实现 以下是一个使用C语言实现的矩阵鞍点查找算法[^3]: ```c #include <stdio.h> #define MAX_SIZE 100 int findSaddlePoints(int A[MAX_SIZE][MAX_SIZE], int m, int n) { int i, j, k; int rowMinIndex, colMaxFlag; int saddlePointCount = 0; for (i = 0; i < m; i++) { // 遍历每一行 int minVal = A[i][0]; rowMinIndex = 0; for (j = 1; j < n; j++) { // 找到当前行的最小值 if (A[i][j] < minVal) { minVal = A[i][j]; rowMinIndex = j; } } colMaxFlag = 1; // 假设当前行最小值是列最大值 for (k = 0; k < m; k++) { // 检查是否为列最大值 if (A[k][rowMinIndex] > A[i][rowMinIndex]) { colMaxFlag = 0; break; } } if (colMaxFlag == 1) { // 如果是列最大值,则记录鞍点 printf("A[%d][%d] ", i, rowMinIndex); saddlePointCount++; } } return saddlePointCount; } int main() { int T, m, n; scanf("%d", &T); // 输入测试案例数 while (T--) { scanf("%d %d", &m, &n); // 输入矩阵大小 int A[MAX_SIZE][MAX_SIZE]; for (int i = 0; i < m; i++) { // 输入矩阵元素 for (int j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } int count = findSaddlePoints(A, m, n); // 查找鞍点 if (count == 0) { printf("NO.\n"); } else { printf("\n"); } if (T > 0) { printf("\n"); // 两个案例之间空一行 } } return 0; } ``` #### 示例输入输出 根据提供的示例输入[^4],可以验证程序的正确性: **输入:** ``` 3 2 2 2 3 1 1 3 3 1 2 3 4 5 6 7 8 9 5 5 11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25 ``` **输出:** ``` A[1][0] NO. A[3][0] ``` #### 时间复杂度分析 上述算法的时间复杂度为 \(O(m \times n)\),其中 \(m\) 是矩阵的行数,\(n\) 是矩阵的列数。这是因为需要遍历矩阵的每一行以找到行最小值,并对每个行最小值进行列检查。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十四桥_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值