C程序题目:找出一个二维数组中的鞍点 即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。

https://blog.csdn.net/liubinzi123/article/details/8237005
按照这个的话 3 3 1
4 2 6
7 1 9
鞍点会是3,但是鞍点不应该是同行最大值么?两个都是3的话,也是鞍点?也就是说怎么排除掉相等的情况啊,其实再举例一下,情况貌似好复杂唉

思路:遍历矩阵的每一行,找出最大值,在最大值对应的列找最小值,然后判断最大值和最小值的位置是否相等。具体代码如下:


#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");
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-04-16

你可以看看最大的周围四个数有没有相等的,有相等的你可以认为不是鞍点。

你给的链接的程序有严重的问题,你看下面两个输入,原则上矩阵相似的,如果说一个有鞍点,另一个也应该认为有鞍点。

请输入数组元素:
    3    3    1
    4    2    6
    7    1    9
a[0][0]=3

而如果这样输入

请输入数组元素:
    3    3    1
    2    4    6
    1    7    9
不存在鞍点!

追问

那能否帮完善呢?还有楼下那位说的最大定义对么?还是离散数学那个对?

追答

这个程序本身很简单,关键要看你想怎么定义鞍点。
从数学上来说应该是区域极大和极小。

本回答被提问者采纳
第2个回答  2019-05-09
#include<iostream>
using namespace std;
int n,a[10][10];
bool max(int h,int i){
    for(int m=0;m<n;m++){
        if(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;m<n;m++){
        if(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;h<n;h++){
        for(i=0;i<n;i++){
            cin>>a[h][i];
        }
    }
    for(h=0;h<n;h++){
        for(i=0;i<n;i++){
            if(max(h,i)&&min(h,i)){
                cout<<h<<" "<<i;
                t++;
            }
        }
    }
    if(t==0)cout<<"NONE";
}

第3个回答  2019-04-16
为什么要“排除掉相等”的情况,相等的也是最大或最小。最大就是没有比它更大的了3 3 1中哪有比3还大的?所以3最大。追问

最大好像是所有的都比他小,极大才是没有比他大,离散数学这么定义的

追答

那是你的理解。没有比它更大的,它不就是最大的吗?至于有多个最大的那无关紧要,因为并没有要求“唯一”最大的。

追问

原来如此啊,怪不得我总觉得老师有问题。。。原来是我强行弄唯一了

原来如此啊,怪不得我总觉得老师有问题。。。原来是我强行弄唯一了

相似回答