如果在一矩阵中元素A[i][j]满足A[i][j]为第i行的最小值,第j行的最大值,则称这个元素为这个矩阵的马鞍点,求m*n矩阵所有的马鞍点。若需求一个矩阵的所有马鞍点,其实只需将矩阵的每行的最小值与每列的最大值分别求出存在相应的数组中,在遍历一遍原矩阵确定元素是否满足条件即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int arr[20][20];
int hang[20];
int lie[20];
int main()
{int m,n;while(~printf("请输入m和n的值:")){scanf("%d %d",&m,&n);memset(arr,0,sizeof(arr));memset(hang,0,sizeof(hang));memset(lie,0,sizeof(lie));printf("请输入%d行%d列的矩阵:\n",m,n);for(int i=1;i<=m;i++){int minl=1e9+7;for(int j=1;j<=n;j++){scanf("%d",&arr[i][j]);minl=min(minl,arr[i][j]);}hang[i]=minl;}for(int j=1;j<=n;j++){int maxl=-(1e9+7);for(int i=1;i<=m;i++){maxl=max(maxl,arr[i][j]);}lie[j]=maxl;}bool ju=false;printf("该%d行%d列的矩阵的马鞍点为:\n",m,n);for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(arr[i][j]==hang[i]&&arr[i][j]==lie[j]){printf("第%d行第%d列的元素:arr[%d][%d]=%d\n",i,j,i,j,arr[i][j]);ju=true;}}}if(!ju)printf("该%d行%d列的矩阵没有马鞍.\n");}
}
下面为一组测试数据: