/**
* 实验题目:
* 求一个矩阵的马鞍点
* 实验目的:
* 掌握数组算法设计以及多重循环
* 实验内容:
* 如果矩阵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