以此题为例,题目内容:
从键盘上输入4*5的二维数组的元素,查找这个数组是否有鞍点。
若存在鞍点,则输出鞍点的值及它的行列下标,若没有鞍点则输出 No
二维数组鞍点的定义:存在一个二维数组a[n][m],有一个元素a[i][j],在i行中它是最大的元素,在j列中它是最小的元素,则认为a[i][j],关于二维数组中的鞍点的个数的问题,未找到准确的定义,一个二维数组最多只有一个鞍点。(就是说先找到数组一行中最大的数,然后将这个行最大数跟它同列的数进行比较,若它在其所在行中最大而在其所在列中最小,那它就是这个二维数组的鞍点😉)
例:
(1)输入:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
输出:a[0][4]=5
(2)输入:
1 2 3 4 11
2 4 6 8 12
3 6 9 10 15
4 8 12 16 7
输出:No
直接上代码
#include<stdio.h>
#define N 4 //初始化定义,跟赋值差不多
#define M 5 //但它可是很专一的!!!
int main()
{
int i,j;
int max,jmax;//max用来代表行最大数,jmax来记录数据的列角标
int z=1;//判断二维数组是否有鞍点
int f;//判断行最大数是否是该列的列最小数
int a[N][M];//定义二维数组 v( ̄︶ ̄)↗
for(i=0;i<N;i++) //i表示行数,i=0表示第一行
for(j=0;j<M;j++)//j表示列数,j=0表示第一列
scanf("%d",&a[i][j]);//键盘输入二维数组
for(i=0;i<N;i++) //i表示行数,i=0表示第一行
{max=a[i][0];//默认将每行第一列数据设为行最大数,并将其值赋给max
jmax=0;//默认列角标为第一列
for(j=1;j<M;j++)//默认每行第一列数据最大,且max已取其值,所以max直接与第二列比较即可
{if(max<a[i][j])//若此行中其它列的数比max的值大,则将其的值赋给max
{max=a[i][j];
jmax=j;//记录行最大值的列角标
}
}
f=1;
for(j=0;j<N;j++) //此处j与上面不一样,因为每次循环j都会重新赋值所以此处使用j表示行数无影响
{if(a[j][jmax]<max)//如果max这个行最大数不是该列中最小的数,那么将f的值赋为0
f=0;
}
if(f==1)//如果max这个行最大数是该列中最小的数,输出其在数组中的位置,和这个数
{printf("a[%d][%d]=%d",i,jmax,max);
z=0;//用于判断二维数组是否有鞍点
}
}
if(z==1)printf("No");//用于判断二维数组是否有鞍点
return 0;
}//枭
运行示例: