描述
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。
鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
输入
输入包含一个5行5列的矩阵
输出
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
样例输入
11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25
样例输出
4 1 8
#include<stdio.h>
#include<string.h>
#define N 5
int max(int n,int (*a)[N],int r)
//判断是否是所在行的最大值,输入这个数n和行数r,访问数组array,
{
int flag=1;
int count=0;
int i;
for (i=0;i<N;i++)
{
if (n>=*(*(a+r)+i)) //保持行不变,由上到下依次比较。*(*(a+r)+i)=a[r][i]
{
count++; //如果满足计数器加一
}
}
if (count==N)
return 1; //如果相同返回1;
else
return -1; //如果不相同,不满足是最大值,返回值-1
}
int min(int n,int (*a)[N],int c)
//判断是否是所在列的最小值,输入这个数n和列数c,访问数组array
{
int flag=1;
int count=0;
int i;
for (i=0;i<N;i++)
{
if (n<=*(*(a+i)+c)) //保持列不变,由上到下依次比较。*(*(a+i)+c)=a[i][c]
{
count++; //如果满足计数器加一
}
}
if (count==N) //比较计数器是否和该行列数相同
return 1; //如果相同返回1;
else
return -1; //如果不相同,不满足是最小值,返回值-1;
}
int main()
{
int array[N][N]={0};
int n,m,flag1=0,flag2=0;
int j=0,i=0;
for (i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&array[i][j]);
}
}
i=0;j=0;
for (i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
flag1=max(array[i][j],array,i);
flag2=min(array[i][j],array,j);
if (flag1==1&&flag2==1)
//如果同时是所在行的最大值,并且是所在列的最小值则存在鞍点,输出鞍点所在的行、列及其值
{
printf("%d %d %d",i+1,j+1,array[i][j]);
return 0;
}
}
}
printf("not found");//如果不存在,输出"not found"
return 0;
}