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<stdio.h>
#define N 3
#define M 4
int main()
int i,j,k,max,min;
int array[N][M];
printf("请输入数组元素:\\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&array<i>[j]);
printf("数组有:\\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
printf("%-5d\\t",array<i>[j]);
printf("\\n");
for(i=0;i<N;i++)
max=array<i>[0];//用列来进行当前行来比较
for(j=0;j<M;j++)
if(max<array<i>[j])
max=array<i>[j];
k=j;//记录下当前一行中最大的小标
min=array[0][k];
for(j=0;j<N;j++)//用行来进行列比较
if(min>array<i>[k])//若在该列中有更小的,则赋值与min
min=array<i>[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(计算机专业用语)
这是我思考后的程序代码,能够运行,还可以进一步精简变量的(如果有这个想法的话)
#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(); //等待键入结束
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语言编程:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。