一、先搞懂:什么是二维数组的鞍点?
鞍点定义:在一个二维数组中,某个元素同时满足两个条件:
- 是它所在行的最大值;
- 是它所在列的最小值。
形象理解:就像马鞍的中心点 —— 在'行方向'上是最高点,在'列方向'上是最低点。
举个直观例子(3×3 数组):
1 3 2
4 5 6
7 8 9
观察元素 3:
- 所在行(第 1 行):
1,3,2→ 3 是行最大值(符合条件 1); - 所在列(第 2 列):
3,5,8→ 3 是列最小值(符合条件 2);→ 所以3是该数组的鞍点!
二、算法思路:分 3 步查找鞍点
要找到鞍点,核心是'先找行最大,再验证列最小',具体步骤如下:
步骤 1:遍历二维数组的每一行
- 对每一行
i,先找到该行的最大值及其所在的列索引col; - 为什么要记录列索引?因为后续需要用该列判断是否为最小值。
步骤 2:验证该行最大值是否为其所在列的最小值
- 针对步骤 1 找到的最大值
arr[i][col],遍历其所在列col的所有元素; - 若该元素是列中最小的(即没有比它更小的元素),则它就是鞍点;
- 若存在比它小的元素,则不是鞍点,继续检查下一行。
步骤 3:处理'无鞍点'的情况
- 若遍历完所有行都未找到满足条件的元素,说明该二维数组没有鞍点,需提示用户。
算法流程图如下(清晰展示逻辑走向):
flowchart TD
A[开始] --> B[初始化二维数组]
B --> C[遍历每一行 i]
C --> D[找到第 i 行的最大值及列索引 col]
D --> E[遍历第 col 列的所有元素]
E --> F{最大值是否为列最小值?}
F -- 是 --> G[输出鞍点位置和值]
F -- 否 --> C
C --> H{所有行遍历完?}
H -- 是 --> I[输出'无鞍点']
I --> J[结束]
G --> J
三、C++ 代码实现:带详细注释
下面用固定数组和动态输入数组两种方式实现,满足不同场景需求。
1. 固定二维数组(适合快速测试)
#include <iostream>
#include <iomanip> // 用于格式化输出
using namespace std;
int main() {
// 1. 定义一个 3×4 的二维数组(可替换为自己的数组)
int arr[][] = {
{, , , },
{, , , },
{, , , }
};
rows = , cols = ;
hasSaddle = ;
( i = ; i < rows; i++) {
rowMax = arr[i][];
colIndex = ;
( j = ; j < cols; j++) {
(arr[i][j] > rowMax) {
rowMax = arr[i][j];
colIndex = j;
}
}
isColMin = ;
( k = ; k < rows; k++) {
(arr[k][colIndex] < rowMax) {
isColMin = ;
;
}
}
(isColMin) {
cout << << endl;
cout << << i + << << colIndex + << << endl;
cout << << rowMax << endl;
hasSaddle = ;
;
}
}
(!hasSaddle) {
cout << << endl;
}
;
}

