c语言 求二维数组的鞍点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 求二维数组的鞍点相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int main()

int a[4][5],i,j,i1,j1=0,max,s=1; /*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);

printf("输入的数组:\n");
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");

printf("\n");

for(i=0;i<=3;i++)

i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)

if(max<a[i][j])

max=a[i][j];
j1=j;


for(i=0;i<=3;i++)
if(max>a[i][j1])break;
if(i>3)

printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;


if(s)
printf("不存在鞍点.\n");
return 0;


输入一个鞍点存在的数组,输出是正确的
但输入一个暗点不存在的数组,却没有输出,请问错在哪里?
还有如果数组中所有元素都是1,这个数组有鞍点吗?
鞍点,既该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。

sample input
1 2 3 4 5回车2 4 6 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
a[0][4]=5

sample input
1 12 3 4 5回车2 4 16 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
鞍点不存在.

#include&lt;stdio.h&gt;

#define N 3

#define M 4

int main()

int i,j,k,max,min;

int array[N][M];

printf("请输入数组元素:\\n");

for(i=0;i&lt;N;i++)

for(j=0;j&lt;M;j++)

scanf("%d",&array&lt;i&gt;[j]);

printf("数组有:\\n");

for(i=0;i&lt;N;i++)

for(j=0;j&lt;M;j++)

printf("%-5d\\t",array&lt;i&gt;[j]);

printf("\\n");

for(i=0;i&lt;N;i++)

max=array&lt;i&gt;[0];//用列来进行当前行来比较

for(j=0;j&lt;M;j++)

if(max&lt;array&lt;i&gt;[j])

max=array&lt;i&gt;[j];

k=j;//记录下当前一行中最大的小标

min=array[0][k];

for(j=0;j&lt;N;j++)//用行来进行列比较

if(min&gt;array&lt;i&gt;[k])//若在该列中有更小的,则赋值与min

min=array&lt;i&gt;[k];

if(min==max)

printf("小标为%d,%d,鞍点为:%d",i+1,k,max);

printf("搜索结束\\n");

return;

扩展资料:

define作用

被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

宏定义的作用范围仅限于当前文件,即file1.c中定义#define PI 3.14,在file2.c中该宏定义不起作用;

通过将#define PI 3.14定义在common.h中,file1.c和file2.c分别#include"common.h"的方式,该宏定义在file1.c和file2.c中都起作用。

在C或C++语言中,“宏”分为有参数和无参数两种。

参考资料:

百度百科——define(计算机专业用语)

参考技术A

这是我思考后的程序代码,能够运行,还可以进一步精简变量的(如果有这个想法的话)

#include <stdio.h>

#define N 3

int main()//行最大,列最小 

int a[N][N],i,j,k,t;//

for(i=0;i<N;i++)

for(j=0;j<N;j++)

scanf("%d",&a[i][j]);//按行对数组进行输入

int temp,b,c,min,flag=0;

for(i=0;i<N;i++)//求出行的最大值 

temp=a[i][0];

   for(j=0;j<N;j++)

    if(a[i][j]>temp)

     temp=a[i][j],b=j,c=i;//每行的最大值,保留行最大值的列号b、行号a 

 

    for(k=0,min=a[0][b];k<N;k++) //每列的最大值

if(a[k][b]<min)

    min=a[k][b],t=k;

    

    if(t==c)//判断行最大与列最小是否共同指向一个数 

flag=1,printf("%d ",min);//输出该鞍点 

if (flag==0)

printf("该二维数组没有鞍点");

  

参考技术B #include<stdio.h>
int
main()

int
a[4][5],i,j,i1,j1=0,max,s=1;
int
i2;/*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);

printf("输入的数组:\n");
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");

printf("\n");
for(i=0;i<=3;i++)

i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)

if(max<a[i][j])

max=a[i][j];
j1=j;


for(i2=0;i2<=3;i2++)
if(max>a[i2][j1])break;
if(i2>3)

printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;


if(s)
printf("不存在鞍点.\n");
return
0;

/******************程序在VC++6.0里运行成功********************************/
说明:我定义了一个整形变量i2。
循环体里最好不要出现循环变量,因为随时会改变循环
参考技术C

#include <stdio.h>

#include <time.h>

#include <stdlib.h> //添加随机数需要的头文件

#define N 3   //预处理设置N的值


int main()

srand((unsigned int) time (NULL)); //设置随机数种子为时间

int array[N][N];

int i,j,k;

int point,max,min,flag=0;

for (i=0;i<N;i++)

for (j=0;j<N;j++)

array[i][j]=rand();

printf("%d\\t",array[i][j]); //用随机数初始化数组

putchar('\\n');

for (i=0;i<N;i++)

max=0;

for (j=0;j<N;j++)

if (array[i][j]>array[i][max]) //行内比较大小

max=j;

min=i;

for (j=0;j<N;j++)

if (array[j][max]<array[min][max]) //行内最大值在列内比较

min=j;

if (min==i)

printf("鞍点为array[%d][%d] = %d\\n",min,max,array[min][max]); //若有鞍点,输出,并改变flag的值

flag=1;

if (flag==0)

printf("此二维数组无鞍点!\\n"); //若无鞍点,提示

getchar(); //等待键入结束


参考技术D #include<stdio.h>
int main()

int a[4][5],i,j,i1,j1=0,max,s=1;
int i2;/*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);

printf("输入的数组:\n");
for(i=0;i<=3;i++)

for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");

printf("\n");
for(i=0;i<=3;i++)

i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)

if(max<a[i][j])

max=a[i][j];
j1=j;


for(i2=0;i2<=3;i2++)
if(max>a[i2][j1])break;
if(i2>3)

printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;


if(s)
printf("不存在鞍点.\n");
return 0;


/******************程序在VC++6.0里运行成功********************************/
说明:我定义了一个整形变量i2。
循环体里最好不要出现循环变量,因为随时会改变循环本回答被提问者和网友采纳

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

1:找出一个多维数组的鞍点,即该元素在该行上最大,在该列上最小,也可能没有鞍点

a = [
    [1,2,3,4],
    [4,5,6,2],
    [7,0,5,2],
    [11,10,7,9]]

解题思路如下:

step1:先找出每行的最大值,及其index,输出最大值,即所在行和列作为要给list存如result列表中,函数写法如下:

def find_saddle_max_point(s):
    result =[]
    #用result存储每行最大值以及其index
    for i in range(len(s)):
        #遍历次数,即一共有多少个行,如例子中一共有4行,该值等于a的元素个数
        max =s[i][0]
#设定每行的最大值为第一个
        location =[]
#新建一个location列表来存储该值在外层的index和内层的index
        index=0
#设定最大值所在的列的index值为0
        for j in range(len(s[i])):           
            #遍历每行的每个值
            if s[i][j]>max:
                max = s[i][j]
                index =j
#找出最大值以及最大值所在列,即j的值
        location.append(i)
        location.append(index)
#存入横向列表坐标和纵向坐标值
        result.append((max,location))
#将最大值及所在的location(包括横向坐标和纵向坐标)存如result中
    return result
print(find_saddle_max_point(a))

step2:找出二维矩阵每列最小值,函数写法同step1

def find_saddle_min_point(s):
    result =[]
    for i in range(len(s[0])):
        #遍历列的次数,如a有4列,列的遍历次数等于a的嵌套列表的长度
        min = s[0][i]
#设定最小值为每列第一个
        location=[]
        index=0
        for j in range(len(s)):
            #遍历每列的值
            if s[j][i]<min:
                min =s[j][i]
                index = j
        location.append(index)
        location.append(i)
#将每列的最小值所在的index存如location列表中
        result.append((min,location))
#将每列的最小值以及所在的location存如result中
    return result
print(find_saddle_min_point(a))

step3:遍历step1和step2生成的列表,如果有最大值和最小值重复,并且index一样,即2个列表中有重复元素则为二维数组的鞍点

#step3:如果最小值与最大值重复,并且其index一样,则为鞍点
def find_saddle(a):
    list1 = find_saddle_max_point(a)
    list2 = find_saddle_min_point(a)
    for i in list1:
        if i in list2:
            return i
    else:
        return False
print(find_saddle(a))

 

 





以上是关于c语言 求二维数组的鞍点的主要内容,如果未能解决你的问题,请参考以下文章

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

C语言的鞍点怎么求

C语言 计算二维数组的鞍点,鞍点的元素值在该行最大,在该列上最小,若没有鞍点输出“NO“

c语言问题 找矩阵中的鞍点

c语言编程 求鞍点

C语言 找鞍点