矩阵的马鞍点
描述
若在矩阵A中存在一个元素a i,j(0≤i≤n-1,0≤j≤m-1),该元素是第i行元素中最小值且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。假设以二维数组存储矩阵A,试设计一个求该矩阵所有马鞍点的算法。首行输入矩阵的的大小n*m, 然后n行每行输入m个元素。
测试用例1:
3 3
1 2 3
4 5 6
7 8 9
运行结果:
A[2][0]=7
测试用例2:
5 5
9 7 6 8 3
20 26 22 25 23
28 36 16 30 43
20 21 22 23 54
1 2 3 4 5
运行结果:
没有鞍点
测试用例3:
4 4
9 7 6 8
20 26 22 25
28 36 25 30
1 2 3 4
运行结果:
A[2][2]=25
因为给出的代码有全局变量,我不太喜欢用全局变量所以我把n,m做成参数传进去了。
#include <iostream>
#include <stdio.h>
#define N 20
using namespace std;
void MinMax(int A[N][N],int n,int m) {
bool have = false;
int i,j;
int min[n];
int max[m];
for (i = 0; i < n; i++) { //计算出每行的最小值元素,放入min[0..M-1]之中
int minNumber=A[i][0];
for(j = 0; j < m; j++){
if(minNumber > A[i][j]){
minNumber = A[i][j];
}
}
min[i] = minNumber;
}
for (j = 0; j < m; j++) { //计算出每列的最大值元素,放入max[0..N-1]之中
int maxNumber = A[0][j];
for(i = 0 ;i < n; i++){
if(maxNumber < A[i][j]){
maxNumber = A[i][j];
}
}
max[j] = maxNumber;
}
for (i = 0; i < n; i++) //判定是否为马鞍点
for (j = 0; j < m; j++)
if (min[i] == max[j]) {
printf("A[%d][%d]=%d\n", i, j, A[i][j]); //显示马鞍点
have = true;
}
if (!have)
printf("没有鞍点\n");
}
int main() {
int n, m;//行 列
cin >> n >> m;
int matrix[20][20];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> matrix[i][j];
}
}
MinMax(matrix,n,m); //调用MinMax()找马鞍点
return 0;
}