输出鞍点的行列下标题解

题目

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

本题要求编写程序,求一个给定的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

思路

首先这道题所说的最大值指的是,所有元素都小于等于这个值,最小值指的是所有元素都大于等于这个值,这就说明了最大值和最小值不只一个,由此想到了,需要一个数组,记为index,记录当前行最小值的列下标,然后遍历index数组,判断该列下这个值是不是最小值,如果是,则输出结果,并返回,否则继续查找。

用以下图片来说明这个思路:

首先遍历第一行,找出该行最大值9,有两个

 然后遍历该最大值9对应的列,比较发现9不是最小值

 遍历第二行,找到最大值7

  然后遍历该最大值7对应的列,比较发现7是最小值,输出结果,结束并返回

代码

#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    int i;
    int a[n][n];
    int j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int index[n];
    int count=0;
    for(i=0;i<n;i++){
        int max=-1;
        int min=-1;
        for(j=0;j<n;j++){
            if(a[i][j]>max){
                max=a[i][j];
                count=0;
                index[count]=j;
            }
            else if(a[i][j]==max){
                count++;
                index[count]=j;
            }
        }
        int k=0;
        for(k=0;k<=count;k++){
            int flag=0;
            min=a[i][index[k]];
            for(j=0;j<n;j++){
                if(a[j][index[k]]<min&&j!=i) {
                    flag=1;
                    break;
                }
            }
            if(flag==0) {
                printf("%d %d",i,index[k]);
                return 0;
            }
        }
    }
    printf("NONE");
}

运行结果

总结

通过解决矩阵鞍点问题,我深刻认识到双重循环在提升个人编程能力方面的关键性作用。通过巧妙嵌套循环,我能够遍历矩阵中的每个元素,实现对二维结构的全面探索。这锻炼了我的循环设计思维,使我能够更灵活、高效地处理复杂问题。

在这个过程中,我学会了合理选择循环的起始和结束条件,以确保程序正确执行。通过理解循环嵌套的控制流,我能够更好地分析问题并设计出更优雅的解决方案。同时,我注重了对性能的优化,避免不必要的重复计算,提高代码的执行效率。

这次编程实践为我提供了深入理解和运用双重循环的机会,加强了我在处理二维数据结构时的编程技能。这是提升个人编程水平的重要一步,为未来更复杂的算法和数据处理任务奠定了基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值