一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
提交结果:
基本思路:
行和列上的最大、最小值可以不唯一,但行最大值要下标最大,在列上没有更小的值就判为鞍点
1.创建并接收变量和数组
2.找出行中的最大值,然后在最大值对应的列中,判断是否是这列元素的最小值,是则输出,不是则判断下一行是否有鞍点
3.创建变量用于输出结果时判断鞍点,并且按照要求输出结果
代码实现:
#include<stdio.h>
#define MAXN 6
int main() {
int n = 0;
scanf("%d", &n);//接收正整数n
int arr[MAXN][MAXN] = { 0 };
for (int i = 0; i < n; i++) {//接收数组
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
int flag = 0;//判断是否是鞍点
for (int i = 0; i < n; i++) {
int col = 0;//每次都从第一列往后查找最大值
flag = 0;//每循环一次都重置
for (int j = 0; j < n; j++) {//找出第j行的最大值,并且要是下标最大的
if (arr[i][col] <= arr[i][j]) {
col = j;//固定最大值所在的列
}
}
for (int k = 0; k < n; k++) {//在行最大值对应的列判断是否是该列最小值,有相同最小值也可以
if (arr[i][col] > arr[k][col]) {
flag = 1;//不是鞍点
break;
}
}
if (flag == 0) {//鞍点按照要求输出结果
printf("%d %d", i, col);
break;//结束查找
}
}
if (flag == 1) {//不是鞍点按照要求输出结果
printf("NONE");
}
return 0;
}
欢迎提问和纠错,共同讨论一起进步!