C语言算法:在N阶方阵中求解行列最值(Saddle Point相关)
面对N阶整数方阵,如何通过C语言编程分别找出“每行最大值中的最小值”以及“每行最小值中的最大值”?本文将通过实例详解输入、遍历比较的逻辑,并提供可直接运行的完整代码。
一、问题描述
在处理二维数据结构时,除了寻找全局的最值,有时需要关注局部的极值关系。本算法针对一个 N × N 的整数方阵(int a[MAXN][MAXN]),旨在计算并输出以下两个关键数值:
- 鞍点候选值 A:首先从每一行中选出该行的最大值,然后在这些选出的行最大值中,再找出其中最小的那个数。
- 鞍点候选值 B:首先从每一行中选出该行的最小值,然后在这些选出的行最小值中,再找出其中最大的那个数。
这一过程常用于分析矩阵的性质(如寻找鞍点)或进行特定的数据统计处理。
二、环境准备
为了演示 C 语言算法的运行结果,建议使用 Visual Studio 2019 及以上版本的集成开发环境。该环境提供了完善的调试工具和编译器支持。
在开始编码前,请确保已正确安装 Visual Studio 2019,并新建一个 C++ 控制台应用程序项目。Visual Studio 2019 具备高效的 IntelliSense 和代码重构功能,有助于快速排查语法错误。
三、算法实现步骤
第 1 步:引入头文件与定义常量
首先需要包含标准输入输出库及系统调用库,并定义一个足够容纳测试数据的矩阵维度上限。
#include <stdio.h>
#include <stdlib.h>
#define MAXN 20 // 定义最大矩阵维数为 20
第 2 步:声明全局数组与局部变量
声明一个二维整型数组用于存储数据,同时声明用于循环计数、暂存最大/最小值的变量。
int a[MAXN][MAXN]; // 全局数组,自动初始化为0
int min_val, max_val; // 注意:此处变量名需区分行内极值和最终结果,下文代码中用 min 和 max 做中间状态
int row, col, n;
第 3 步:获取用户输入
程序启动后,提示用户输入方阵的阶数 n,随后使用嵌套 for 循环接收方阵的所有元素。
printf("Please input the order of the matrix (max 20): ");
scanf("%d", &n);
if (n > MAXN || n <= 0) {
printf("Invalid size.\n");
return 0;
}
printf("Please input the elements:\n");
for (row = 0; row < n; row++) {
for (col = 0; col < n; col++) {
scanf("%d", &a[row][col]);
}
}
第 4 步:打印原始矩阵
为了验证输入数据是否正确,遍历数组并格式化输出,每行换行分隔。
printf("\nThe original matrix is:\n");
for (row = 0; row < n; row++) {
for (col = 0; col < n; col++) {
printf("%-5d", a[row][col]); // %-5d 表示左对齐占5位
}
printf("\n");
}
第 5 步:计算“每行最大值中的最小值”
逻辑说明:初始化一个极小值作为候选基准。遍历每一行,先找出该行的最大值(row_max),然后将这个 row_max 与当前的全局候选最小值进行比较更新。
// 计算 min(max(row_i))
int min_of_maxs = a[0][0]; // 初始化为第一行第一个元素,实际会在循环中修正
for (row = 0; row < n; row++) {
int current_row_max = a[row][0];
// 1. 在当前行找最大值
for (col = 1; col < n; col++) {
if (a[row][col] > current_row_max) {
current_row_max = a[row][col];
}
}
// 2. 更新“最大值中的最小值”候选
if (row == 0) {
min_of_maxs = current_row_max;
} else {
if (current_row_max < min_of_maxs) {
min_of_maxs = current_row_max;
}
}
}
printf("The minimum of maximums is: %d\n", min_of_maxs);
第 6 步:计算“每行最小值中的最大值”
逻辑说明:类似地,遍历每一行先找出该行的最小值(row_min),然后找出这些行最小值里面最大的那个。
// 计算 max(min(row_i))
int max_of_mins = a[0][0];
for (row = 0; row < n; row++) {
int current_row_min = a[row][0];
// 1. 在当前行找最小值
for (col = 1; col < n; col++) {
if (a[row][col] < current_row_min) {
current_row_min = a[row][col];
}
}
// 2. 更新“最小值中的最大值”候选
if (row == 0) {
max_of_mins = current_row_min;
} else {
if (current_row_min > max_of_mins) {
max_of_mins = current_row_min;
}
}
}
printf("The maximum of minimums is: %d\n", max_of_mins);
四、完整源代码
以下是整合了上述所有逻辑的完整 main.c 代码,可以直接复制到 Visual Studio 中进行编译运行。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAXN 20
int a[MAXN][MAXN];
int main()
{
system("color 3E"); // 设置终端背景为浅蓝,文字为深绿
int min_of_maxs, max_of_mins;
int row, col, n;
printf("Please input the order of the matrix:\n");
scanf("%d", &n);
if (n > MAXN || n <= 0) {
printf("Size error!\n");
return 1;
}
printf("Please input the elements of the matrix:\n");
for (row = 0; row < n; row++)
{
for (col = 0; col < n; col++)
{
scanf("%d", &a[row][col]);
}
}
printf("\nThe original matrix is\n");
for (row = 0; row < n; row++)
{
for (col = 0; col < n; col++)
{
printf("%d ", a[row][col]);
}
printf("\n");
}
printf("\n");
// --- Logic 1: Minimum of Maximums ---
for (int r = 0; r < n; r++)
{
// Find max in this row
int row_max = a[r][0];
for (int c = 1; c < n; c++) {
if (a[r][c] > row_max) row_max = a[r][c];
}
// Update global min_of_maxs
if (r == 0) {
min_of_maxs = row_max;
} else {
if (row_max < min_of_maxs) {
min_of_maxs = row_max;
}
}
}
printf("The minimum of maximum numbers is %d\n", min_of_maxs);
// --- Logic 2: Maximum of Minimums ---
for (int r = 0; r < n; r++)
{
// Find min in this row
int row_min = a[r][0];
for (int c = 1; c < n; c++) {
if (a[r][c] < row_min) row_min = a[r][c];
}
// Update global max_of_mins
if (r == 0) {
max_of_mins = row_min;
} else {
if (row_min > max_of_mins) {
max_of_mins = row_min;
}
}
}
printf("The maximum of minimum numbers is %d\n", max_of_mins);
system("pause");
return 0;
}
五、总结
本例展示了如何利用C语言处理二维数组的双层筛选逻辑。核心在于理清两层循环的作用域:外层控制“行”,内层控制“当前行内的列比较”。这种算法结构不仅适用于求最值,也是理解矩阵运算(如求鞍点、旋转矩阵等)的基础。掌握此类逻辑,能有效提升处理多维数据的能力。
以上就是C语言在二维数组中寻找特定最值问题的详细内容,更多关于C语言求数组最值的资料请关注本站其它相关文章!免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









