二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。

分析:一个有N行M列的二维数组,会有N个行的最大元素,M个列的最小元素,当行的最大值和列的最小值相等且是同一个元素时,这个元素就是该二维数组的鞍点。



1 /*
2 找出一个二维数组中的鞍点,
3 即该位置上的元素在该行上最大,
4 在该列上最小。也可能没有鞍点。
5 代码中可以通过修改宏定义M N的值修改二维数组的行列数。
6 */
7 #include<stdio.h>
8 #define N 3
9 #define M 3
10
11 int main()
12 {
13 int arr[N][M];
14 int temp1[N],temp2[M];
15 int i,j;
16 int temp=0;//定义一个标记,初始化为假(0),表示没有鞍点
17
18 printf("请为二维数组array[%d][%d]赋值:\n",N,M);
19 for(i=0;i<N;i++)
20 {
21 for(j=0;j<M;j++)
22 {
23 scanf("%d",&arr[i][j]);
24 }
25 }
26
27 //判断每一行的最大值
28 for(i=0;i<N;i++)
29 {
30 temp1[i]=arr[i][0];//用i行第1个值初始化temp1;
31 for(j=0;j<M;j++)
32 {
33 if(temp1[i]<arr[i][j])
34 temp1[i]=arr[i][j];
35 }
36 }
37
38 //判断每一列的最小值
39 for(i=0;i<M;i++)
40 {
41 temp2[i]=arr[0][i];//用i列第1个值初始化temp2;
42 for(j=0;j<N;j++)
43 {
44 if(temp2[i]>arr[j][i])
45 temp2[i]=arr[j][i];
46 }
47 }
48
49 //判断是否有鞍点
50 for(i=0;i<N;i++)
51 {
52 for(j=0;j<M;j++)
53 {
54 //当行的最大值和列的最小值相等且是同一个元素时,这个元素是鞍点
55 if(arr[i][j]==temp1[i] && arr[i][j]==temp2[j])
56 {
57 printf("该二维数组的鞍点为%d\n",arr[i][j]);
58 temp=1;//标记改为真(1),表示有鞍点
59 }
60 }
61 }
62
63 if(temp==0)//如果标记为假(0)
64 printf("该二维数组没有鞍点\n");
65
66 return 0;
67 }


 

 

测试数据:1 4 2 1 3 2 3 5 1 

运行结果:

C语言 | 找出一个二维数组中的鞍点_最小值