求一个矩阵的马鞍点

/**
*    实验题目:
*        求一个矩阵的马鞍点
*    实验目的:
*        掌握数组算法设计以及多重循环
*    实验内容:
*        如果矩阵A中存在这样的一个元素,满足条件:A[i][j]是第i行中值最小的元素,
*    且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。设计程序,求出mxn
*    的矩阵A的所有马鞍点。
*/

#include <stdio.h>
#include <stdbool.h>

#define M 4
#define N 4

/*--------------------求矩阵A的所有马鞍点---------------------*/
/**
*   算法思路
*       先求出每行的最小值元素,放入数组min[M]中,再求出每列的最大值元素,放入数组max[N]中,
*   若某元素既在min[i]中,又在max[j]中,则该元素A[i][j]是马鞍点,找出所有这样的元素,也就找
*   到了所有马鞍点。
*/
static void min_max(int A[M][N]);

int main(int argc, char *argv[])
{
    int i, j;

    // 定义二维数组并初始化
    int A[M][N] = {
        {9, 7, 6, 8},
        {20, 26, 22, 25},
        {28, 36, 25, 30},
        {12, 4, 2, 6}
    };
    printf("A矩阵:\n");
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
            printf("%4d", A[i][j]);
        printf("\n");
    }
    printf("A矩阵中的马鞍点:\n");
    min_max(A);

    return 0;
}

static void min_max(int A[M][N])
{
    int i, j;
    bool have = false;
    int min_row[M], max_col[N];

    /*-------------------计算出每行的最小值元素,放入min_row[0,1,...,M-1]中----------------------*/
    for(i = 0; i < M; i++)
    {
        min_row[i] = A[i][0]; // 假设第i行第0列的元素为第i行的最小值元素
        for(j = 1; j < N; j++)
        {
            if(A[i][j] < min_row[i])
            {
                min_row[i] = A[i][j];
            }
        }
    }

    /*-------------------计算出每列的最大值元素,放入max_col[0,1,...,N-1]中----------------------*/
    for(j = 0; j < N; j++)
    {
        max_col[j] = A[0][j]; // 假设第0行第j列的元素为第j列的最大值元素
        for(i = 1; i < M; i++)
        {
            if(A[i][j] > max_col[j])
            {
                max_col[j] = A[i][j];
            }
        }
    }

    /*-------------------判断是否为马鞍点----------------------*/
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            if(min_row[i] == max_col[j])
            {
                printf("  A[%d][%d] = %d\n", i, j, A[i][j]);
                have = true;
            }
        }
    }

    if(!have)
        printf("没有马鞍点\n");
}
测试结果:

A矩阵:
   9   7   6   8
  20  26  22  25
  28  36  25  30
  12   4   2   6
A矩阵中的马鞍点:
  A[2][2] = 25

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值