思路:遍历矩阵的每一行,找出最大值,在最大值对应的列找最小值,然后判断最大值和最小值的位置是否相等。具体代码如下:
#include <stdio.h>
#include<stdlib.h>
void FindSaddlePoint(int a[][20], int m, int n);
main()
{
int a[20][20]; //数组储存矩阵
int m,n; //分别表示矩阵的行数和列数
int i,j; //循环变量
//人机交互输入数据
printf("Input m,n:\n");
scanf("%d,%d",&m,&n);
printf("Input matrix:\n" );
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
FindSaddlePoint(a,m,n);
system("pause");
}
//函数功能:输入矩阵数组、行数和列数,判断是否存在鞍点并输出结果
void FindSaddlePoint(int a[][20], int m, int n)
{
int i,j,k; //循环变量
int b,c,d; //储存下标:b和d储存最大值的下标,d储存最小值的下标
int flag=0; //判断是否有鞍点:值为1则有,值为0则无
int max,min; //每行中的最大值和每列中的最小值
//第一层循环遍历每一行
for(i=0;i<m;i++)
{
//先该行中的第一个数赋值给最大值并保存其位置
max=a[i][0];
b=i;
d=0;
//找出每一行中的最大值的值及位置
for(j=0;j<n;j++)
{
if(max<a[i][j])
{
max=a[i][j];
b=i;
d=j;
}
}
//先将找到的最大值赋值给最小值,作为初值并存储下标(由于列是一样的所以只需要储存行的位置即可)
min=max;
c=b;
//从找到的最大值中的那一列找该列的最小值并存储其位置
for(k=0;k<m;k++)
{
if(min>a[k][d])
{
min=a[k][d];
c=k;
}
}
//判断最大值和最小值的位置是否相同
if(b==c)
{
flag=1;
break;
}
}
//输出语句
if(flag==1)
printf("a[%d][%d] is %d\n",b,d,max);
else
printf("No saddle point!\n");
}