计算鞍点

GitHub跳转原题关系图返回列表

逐行找唯一最大值,再判断它是否同时为所在列最小值来定位鞍点。

OJ: noi_openjudge

题目 ID: ch0108-05

难度:入门

标签:矩阵模拟python

日期: 2026-07-30 23:01

题意

寻找 5×55\times5 矩阵中既是所在行最大值又是所在列最小值的鞍点。

思路

每行最多只有一个候选,即该行最大值。找到候选列后,检查它是否等于这一列的最小值;满足时立即输出。

代码

cpp
#include <cstdio>

int a[10][10];

int main(){
    int i,j;
    for (i=1;i<=5;i++){
        for (j=1;j<=5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for (i=1;i<=5;i++){
        int max = -1;
        int pos;
        for (j=1;j<=5;j++){
            if( a[i][j] > max ){
                max = a[i][j];
                pos = j;
            }
        }
        bool flag = true;
        for(j=1;j<=5;j++){
            if(a[j][pos] < max){
                flag = false;
                break;
            }
        }
        if( flag == true){
            printf("%d %d %d",i,pos,max);
            return 0;
        }
    }
    printf("not found");
    return 0;
}

复杂度

总结

Python代码

python
matrix = [list(map(int, input().split())) for _ in range(5)]

for row, values in enumerate(matrix):
    value = max(values)
    column = values.index(value)
    if value == min(matrix[index][column] for index in range(5)):
        print(row + 1, column + 1, value)
        break
else:
    print("not found")

C++代码

cpp
#include <cstdio>

int a[10][10];

int main(){
    int i,j;
    for (i=1;i<=5;i++){
        for (j=1;j<=5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for (i=1;i<=5;i++){
        int max = -1;
        int pos;
        for (j=1;j<=5;j++){
            if( a[i][j] > max ){
                max = a[i][j];
                pos = j;
            }
        }
        bool flag = true;
        for(j=1;j<=5;j++){
            if(a[j][pos] < max){
                flag = false;
                break;
            }
        }
        if( flag == true){
            printf("%d %d %d",i,pos,max);
            return 0;
        }
    }
    printf("not found");
    return 0;
}

复杂度

矩阵规模固定,时间和额外空间复杂度均为 O(1)O(1)

总结

行最大、列最小的复合条件可先缩小到每行唯一候选,再验证另一条件。