合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
习题7-5 找鞍点
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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
二、代码(C语言)⭐️
#include <stdio.h>
int main() {
int n; // 定义变量n,表示矩阵的阶数
scanf("%d", &n); // 输入矩阵的阶数n
int numArr[n][n]; // 定义n×n的二维数组存储矩阵
int rowMaxArr[n]; // 存储每行的最大值
int rowMaxColIndexArr[n]; // 存储每行最大值所在的列索引
int cnt = 0; // 计数器,用于记录处理的行数
// 遍历矩阵的每一行
for (int i = 0; i < n; i++) {
// 初始化当前行的最大值和其列索引
int rowMax = numArr[i][0]; // 假设当前行第一个元素是最大值
int rowMaxColIndex = 0; // 最大值所在的列索引初始为0
// 遍历当前行的每一列
for (int j = 0; j < n; j++) {
scanf("%d", &numArr[i][j]); // 输入矩阵元素
// 更新当前行的最大值及其列索引
if (numArr[i][j] >= rowMax) {
rowMax = numArr[i][j];
rowMaxColIndex = j;
}
}
// 存储当前行的最大值及其列索引
rowMaxColIndexArr[cnt] = rowMaxColIndex;
rowMaxArr[cnt] = rowMax;
cnt++; // 处理行数加1
}
int count = 0; // 鞍点计数器
int rowIndex = 0; // 鞍点所在行索引
int colIndex = 0; // 鞍点所在列索引
// 检查每个行最大值是否是所在列的最小值(鞍点条件)
for (int k = 0; k < cnt; k++) {
int colMin = rowMaxArr[k]; // 初始化列最小值为当前行最大值
// 遍历当前列的所有元素
for (int i = 0; i < n; i++) {
int colNum = numArr[i][rowMaxColIndexArr[k]]; // 获取当前列的元素
if (colNum <= colMin) {
colMin = colNum; // 更新列最小值
}
}
// 如果列最小值等于行最大值,说明找到鞍点
if (colMin == rowMaxArr[k]) {
count++; // 鞍点计数加1
rowIndex = k; // 记录鞍点行索引
colIndex = rowMaxColIndexArr[k]; // 记录鞍点列索引
}
}
// 输出结果
if (count == 0) {
printf("NONE"); // 没有找到鞍点
} else {
printf("%d %d\n", rowIndex, colIndex); // 输出鞍点位置
}
return 0; // 程序正常结束
}
【注意 📢】对于 获取输入字符串 的题目,注意
getchar();
的合理添加:👇🏻
// 吸收数值后的换行符,防止影响下一轮输入
getchar();