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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");

参考技术A #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");
本回答被提问者采纳
参考技术B #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");

参考技术C #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";

参考技术D 一、找到第一行的最大元素
二、判断该元素是不是所在列的最小值

寻找二维数组的“鞍点”

鞍点:该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

    

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 4
 4 #define M 5
 5 int main()
 6 {
 7     int i,j,k,maxj,max,a[N][M],flag;
 8     printf("input matrix:\\n");
 9     for(i=0;i<N;i++){
10         for(j=0;j<M;j++){
11             scanf("%d",&a[i][j]);
12         }
13     }
14     for(i=0;i<N;i++){
15         for(j=0;j<M;j++){
16             printf("%5d",a[i][j]);
17         }
18         printf("\\n");
19     }
20     for(i=0;i<N;i++){
21         max=a[i][0];//开始时假设a[i][0]最大
22         maxj=0;//将最大数的列号存在maxj中
23         for(j=0;j<M;j++){//找出行最大值
24             if(a[i][j]>max){
25                 max=a[i][j];
26                 maxj=j;//将最大数的列号存在maxj中
27             }
28         }
29         flag=1;//假设为鞍点
30         for(k=0;k<N;k++){
31             if(max > a[k][maxj]){//将该行最大数与同列元素相比
32                 flag=0;//如果该数不是同列最小,表示不是鞍点,令flag=0;
33                 continue;//跳出k的循环
34             }
35         }
36         if(flag){//flag为1表示是鞍点
37             printf("a[%d][%d]=%d\\n",i,maxj,max);
38             break;//跳出i的循环
39         }
40     }
41     if(!flag)
42         printf("not exist\\n");
43     system("pause");
44     return 0;
45 }

 

以上是关于C语言编程:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。的主要内容,如果未能解决你的问题,请参考以下文章

c语言查找二维数组的鞍点 新生求助大佬

C语言编程题,找鞍点

20190110-用笨办法找到二维矩阵的鞍点

Java的二维数组的应用及杨辉三角的编写

c语言 求二维数组的鞍点

C语言的鞍点怎么求