思路:遍历矩阵的每一行,找出最大值,在最大值对应的列找最小值,然后判断最大值和最小值的位置是否相等。具体代码如下:
#include
#include
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{
for(j=0;jscanf("%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{
//先该行中的第一个数赋值给最大值并保存其位置
max=a[i][0];
b=i;
d=0;
//找出每一行中的最大值的值及位置
for(j=0;j{
if(max {
max=a[i][j];
b=i;
d=j;
}
}
//先将找到的最大值赋值给最小值,作为初值并存储下标(由于列是一样的所以只需要储存行的位置即可)
min=max;
c=b;
//从找到的最大值中的那一列找该列的最小值并存储其位置
for(k=0;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");
}
你可以看看最大的周围四个数有没有相等的,有相等的你可以认为不是鞍点。
你给的链接的程序有严重的问题,你看下面两个输入,原则上矩阵相似的,如果说一个有鞍点,另一个也应该认为有鞍点。
请输入数组元素:
3 3 1
4 2 6
7 1 9
a[0][0]=3
而如果这样输入
请输入数组元素:
3 3 1
2 4 6
1 7 9
不存在鞍点!
#include
using namespace std;
int n,a[10][10];
bool max(int h,int i){
for(int m=0;mif(a[h][i]>=a[h][m]){
if(m==n-1){
return true;
}
else continue;
}
else break;
}
return false;
}
bool min(int h,int i){
for(int m=0;mif(a[h][i]<=a[m][i]){
if(m==n-1){
return true;
}
else continue;
}
else break;
}
return false;
}
int main(){
int h,i,t=0;
cin>>n;
for(h=0;hfor(i=0;i cin>>a[h][i];
}
}
for(h=0;hfor(i=0;i if(max(h,i)&&min(h,i)){
cout<t++;
}
}
}
if(t==0)cout<<"NONE";
}