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数组查找对应矩阵的列最小值即可。
代码实现:
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");//无鞍点
}
}