#题目描述
若矩阵An*m中某个元素A[i][j]是矩阵第i行中值最小的元素,同时又是第j列中值最
大的元素,则称元素A[i][j]是矩阵中的一个马鞍点。设以二维数组存储矩阵,编写
算法求矩阵A中的所有马鞍点,算法的时间复杂度要尽量的低。
注意当最大值(最小值)并列相等时,会出现多鞍点的情况。
##输入
第一行输入矩阵的总行数M和总列数N,以空格间隔。之后的M行,依次输入矩阵的各行数据,以空格间隔。
4 6
45 67 87 34 56 26
93 75 85 75 92 75
94 85 96 75 78 75
23 17 75 28 98 61~
##输出
若有马鞍点,则以行序为主序,依次输出各个马鞍点。每个马鞍点以(row,col,val)的形式输出,其中row 代表马鞍点的行号,col代表马鞍点的列号,val代表马鞍点的值。若无马鞍点,则输出“NONE”。
(2,4,75)(2,6,75)(3,4,75)(3,6,75)
代码:
#include<stdio.h>
#define M 30
#define N 30
int main()
{
int a[M][N];
int max[M]={0};
int min[N]={0};
int m,n;
int i,j,k,t;
int flag=0;
scanf("%d %d",&m,&n);
//求行最小
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
scanf("%d",&a[i][j]);
for(i=1; i<=m; i++)
{
min[i] = a[i][1];
for(j=2; j<=n; j++)
{
if(a[i][j]< min[i])
min[i] = a[i][j];
}
}
//求列最大
for(i=1; i<=n; i++)
{
max[i] = a[i][i]
for(j=2; j<=m; j++)
{
if(a[j][i] > max[i])
max[i] = a[j][i];
}
}
for(i=1; i<=m; i++ )
{
for(j=1; j<=n; j++)
{
if(max[j] == min[i]){
flag=1;
printf("(%d %d %d)",i,j,a[i][j]);
}
}
}
if(!flag)
prtinf("NONE!");
return 0;
}