代码打卡 PTA7-4 输出鞍点的行列下标

PTA 7-4 输出鞍点的行列下标

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

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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

解题思路:

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

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。因此我们需要先遍历矩阵中的一行,找到最大值,再遍历最大值所在的那列,看其是否为该列的最小值,如果是则为鞍点,输出坐标。

在解题前,我们需要考虑一些特殊情况,即矩阵中不存在鞍点和一行内可能存在多个相同的最大值,对于第一种情况,只需遍历完整个矩阵看是否满足鞍点的条件即可。对于第二种情况我们则需要存储一行中相同的最大值的下标,并依次遍历该列,以免疏漏。

我们采用一个二维数组a用于存储该矩阵,一个二维数组max用于存储行最大值和下标,对于max数组,使用Arrays.fill方法对其赋初值为-1,以避免判断出错并减少遍历的时间。在max数组具体存值规则如下,每行的第一个存该行的最大值,该行的后续元素则用来存储下标,是最大值则存储对应矩阵元素的下标,否则存-1。

max数组效果图

之后通过max数组查找对应矩阵的列最小值即可。

代码实现:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(),cnt=0;
        int a[][] = new int[n][n];
        int max[][] = new int[n][n+1];//存行最大值和下标
        for(int i=0;i<n;i++) {
            Arrays.fill(max[i], -1);//赋初值为-1
        }
        for(int i=0; i<n; i++) { //取矩阵,赋行最大值
            for(int j=0; j<n; j++) {
                a[i][j]=sc.nextInt();
                if(a[i][j]>=max[i][0]) { //务必要大于等于,因为可能有多个最大值的情况,但鞍点的位置可能不同
                    max[i][0]=a[i][j];//存最大值
                    max[i][j+1]=j;//存下标
                    if(j>0&&a[i][0]!=max[i][0]) {
                        max[i][1] =-1;//清空第一次存在最大值的下标0
                        max[i][j] =-1;//再次出现不等的最大值时,清空上一次存在最大值的下标
                    }
                }
            }
        }
//查找鞍点
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if (max[i][j + 1] == -1) {//下标为-1则直接跳过
                    continue;
                }
                for (int z = 0; z < n; z++) {
                    if (a[z][max[i][j + 1]] < max[i][0]) {//列遍历,看是否为最小
                        cnt = 1;
                        break;
                    }
                }
                if (cnt == 0) {//确实为该列最小值,输出并退出该层循环
                    System.out.println(i + " " + max[i][j + 1]);
                    cnt = 1;
                    break;
                }
                if(cnt==1) {//退出该层循环
                    cnt=0;
                }
            }
            if(cnt==1) break;
        }
        if(cnt==0) System.out.println("NONE");//无鞍点
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值