PTA 输出鞍点的行列下标

输出鞍点的行列下标

作者 叶斌  单位 成都信息工程大学

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点的行列值。

输入格式:

输入第一行给出一个正整数n(1≤n≤6),随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 9 4 1
4 7 3 6
1 9 3 2
0 8 8 9

输出样例1:

1 1

输入样例2:

4
7   7  4  1
14  8  3  6
6   6  7  2
10  7  8  9

输出样例2:

NONE

分析:

  • 暴力求解:for循环行数n,嵌套循环遍历找出每行中最大的值,接着超出该行中最大值对应的列中最小值,最后比较该最大值和最小值是否相同,相同即鞍点,不同即继续找。查找的同时要将鞍点的行和列值记录下来,最后输出。
  • 问题:第一次写的时候没有注意一行中可能有多个相同的最大值,就有两个测试点没有通过:鞍点位于前面一个最大值,鞍点位于后一个最大值。       
    • 解决:每行中最大值可能有多个,所以要另外处理最大值大于1个的情况。即将多个相同的最大值放入一个数组中,遍历该数组,一一找对应列的最小值,找到即跳出循环。

通过测试的代码:

#include<stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int max=0,maxF,minF;
    int count=0;
    int moreMax[n],mo;
    //一行一行的找最大值
    for(int i=0;i<n;i++){
        max=a[i][0];
        maxF=0;
        moreMax[0]=-1;
        mo=0;
        for(int j=0;j<n;j++){
            if(max<a[i][j]){
                max=a[i][j];
                maxF=j;
            }
            if(max==a[i][j]){
                if(moreMax[0]==-1){
                    moreMax[0]=maxF;
                    moreMax[1]=j;
                    mo=2;
                }else{
                    moreMax[mo++]=j;
                }
            }
        }
        int min;
        if(mo>0){
            for(int q=0;q<mo;q++){
                min=a[i][moreMax[q]];
                for(int k=0;k<n;k++){
                    if(min>a[k][moreMax[q]]){
                        min=a[k][moreMax[q]];
                        break;
                    }
                }
                if(max==min){
                    maxF=moreMax[q];
                    count++;
                    printf("%d %d\n",i,maxF);
                    break;
                }
            }
        }else{
            min=a[i][maxF];
            for(int k=0;k<n;k++){
                if(min>a[k][maxF]){
                    min=a[k][maxF];
                    break;
                }
            }
            if(max==min){
                count++;
                printf("%d %d\n",i,maxF);
                break;
            }
        }
    }
    if(count==0){
        printf("NONE\n");
    }
    return 0;
}
posted @ 2023-12-02 20:24  吧拉吧拉吧  阅读(22)  评论(0编辑  收藏  举报