C语言编程:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。

步骤简单易懂的

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


#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个回答  2012-04-17
#include<stdio.h>
#define N 10
#define M 10
void main()
{
int i,j,k,m,n,flag1,flag2,a[N][M],max,maxj;
printf("输入行数n:");
scanf("%d",&n);
printf("\n输入列数m:");
scanf("%d",&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
flag2=0;
for(i=0;i<n;i++)
{
max=a[i][0];
for(j=0;j<m;j++)
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
for(k=0,flag1=1;k<n&&flag1;k++)
if(max>a[k][maxj])
flag1=0;
if(flag1)
{
printf("\n第%d行第%d列的%d是鞍点\n",i,maxj,max);
flag2=1;
}
}
if(!flag2)
printf("\n矩阵无鞍点!\n");
}本回答被提问者采纳
第2个回答  2018-11-19
#include "stdio.h"
#define N 10
void FindSaddlePoint(int a[][N], int m, int n);
int main()
{
    int a[N][N];
    int i, j, m, n;
    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);
return 0;
}
void FindSaddlePoint(int a[][N], int m, int n)
{
    int i, j, k, sp, p, x, f=0;
    for (i=0; i<m; i++)
    {
        p = 0;
        sp = a[i][0];
        for (j=1; j<n; j++)
        {
            x = 0;
            if (a[i][j] > sp)
            {
                 sp = a[i][j];
                 x = j;
            }
        }
        for (k=0; k<m; k++)
        {
            if (sp > a[k][x])
                break;
            else
                p++;
        }
        if (p == m)
        {
            printf("a[%d][%d] is %d\n",i, x, sp);
            f++;
        }

    }
    if(!f)
        printf("No saddle point!\n");
}

第3个回答  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";
}

第4个回答  2012-04-17
一、找到第一行的最大元素
二、判断该元素是不是所在列的最小值