【代码】
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 4
void seek(int (*p)[N], int m,int n)
{
int maxrowdata = *(*(p + 0) + 0), col,i,j;
int arr[M];
//找到所有一行中最大的数,把它的列坐标存在了数组arr里
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if ((*(*(p + i) + j)) > maxrowdata)
{
maxrowdata = (*(*(p + i) + j));
col = j;
}
}
arr[i] = col;
}
for (i = 0; i < M; i++) printf("%5d", (*(*(p + i) + arr[i])));
printf("\n");
//把这些数和同一列的其它数比较,看是不是最小的那个
int k,flag=1;
for (i = 0; i < M; i++)
{
flag = 1;
for (k = 0; k<M; k++)
{
if ((*(*(p + i) + arr[i])) > (*(*(p + k) + arr[i]))) flag=0;
}
if (flag == 1)
printf("有第%d个鞍点是:%5d\n", i+1, (*(*(p + i) + arr[i])));
}
}
int main()
{
int a[M][N];
int i, j;
printf("请输入%d个数字,并用空格分隔:\n",M*N);
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
scanf_s("%d", &a[i][j]);
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
printf("%5d", a[i][j]);
printf("\n");
}
seek(a, M,N);
return 0;
}
【解释】
这里一个比较容易想到的方式是我们先找到一个二维数组a[M][N]中每一行的最大的那个数,然后把它的列坐标都存储在一个数组a[M]里面,然后我们通过遍历,把这个存进去的列坐标利用指针方式找到它指向的值,去和同一列的其他数比较,如果其他数有比它还小的,直接pass,如果遍历完一列都没有,那我们就把这个数输出出来。