实验内容:
如果矩阵A中存在这样的一个元素,满足条件:
A[i][j]
是第i
行中值最小的元素,且是第j
列中值最大的元素,则称之为该矩阵的一个马鞍点。
设计程序计算一个m*n
的矩阵A
的所有马鞍点。
实验目的:掌握数组基本操作及算法设计。
#include<iostream>
#define MAX 50
using namespace std;
void InitArray(int a[MAX][MAX], int m, int n) // 初始化矩阵中的元素
{
cout << "请依次输入矩阵中的元素:" << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
cout << "矩阵中的元素初始化成功!" << endl;
}
void LineMin_RowMax(int a[MAX][MAX], int m, int n) // 求矩阵a的马鞍点
{
int ans[MAX];
int count = 0;
for (int line = 0; line < m; line++) // 一行一行的遍历
{
int min = a[line][0]; // 储存行的最小值
int min_j = 0; // 储存行的最小值的下标
for (int j = 0; j < n; j++) // 找到第line行的最小值
{
if (min > a[line][j])
{
min = a[line][j];
min_j = j;
}
}
int max = a[0][min_j]; // 储存列的最大值
int max_i = 0; // 储存列的最大值的下标
for (int i = 0; i < m; i++) // 找到第min_j列的最大值
{
if (max < a[i][min_j])
{
max = a[i][min_j];
max_i = i;
}
}
if (min == max) // 判断是否为马鞍点
{
if(count == 0)
cout << "该矩阵中的马鞍点如下:" << endl;
cout << "第" << max_i + 1 << "行 第" << min_j + 1 << "列 >> " << min << endl; // 输出马鞍点
count++;
}
}
if (count == 0)
{
cout << "该矩阵不存在马鞍点!" << endl;
return;
}
}
int main()
{
int a[MAX][MAX] = { 0 }; // 定义一个数组 其内所有元素初始化为 0
int m, n; // 行数与列数
cout << "请输入矩阵的行数:";
cin >> m;
cout << "请输入矩阵的列数:";
cin >> n;
InitArray(a, m, n); // 初始化矩阵中的元素
LineMin_RowMax(a, m, n); // 找到所有马鞍点 并输出
return 0;
}