C语言算法:在N阶方阵中求解行列最值(Saddle Point相关)

清欢
清欢
发布时间:2026-10-15| 6人浏览过
原创

面对N阶整数方阵,如何通过C语言编程分别找出“每行最大值中的最小值”以及“每行最小值中的最大值”?本文将通过实例详解输入、遍历比较的逻辑,并提供可直接运行的完整代码。

一、问题描述

在处理二维数据结构时,除了寻找全局的最值,有时需要关注局部的极值关系。本算法针对一个 N × N 的整数方阵(int a[MAXN][MAXN]),旨在计算并输出以下两个关键数值:

  1. 鞍点候选值 A:首先从每一行中选出该行的最大值,然后在这些选出的行最大值中,再找出其中最小的那个数。
  2. 鞍点候选值 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语言求数组最值的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。