? ? ? ? 如果在一矩陣中元素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");}
}
下面為一組測試數據: