首先献上我的代码
#include <stdio.h>
#include <stdbool.h>
bool is_row_max(int a[100][100], int n, int x, int y)
{
int j;
for (j = 0; j < n; ++j)
{
if (a[x][j] > a[x][y])//判断x行中a【x】【y】是否是最大值
{
return false;
}
}
return true;
}
bool is_col_min(int a[100][100], int n, int x, int y)
{
int i;
for (i = 0; i < n; ++i)
{
if (a[i][y] < a[x][y])//判断y列中的a【x】【y】是否是最小值
{
return false;
}
}
return true;
}
int main(void)
{
int a[100][100];
int i, j, n;
bool andian_exists = false;
scanf("%d", &n);
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
scanf("%d", &a[i][j]);//数据的输入
}
}
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
if (is_row_max(a, n, i, j) && is_col_min(a, n, i, j))
{
printf("%d %d\n", i, j);
andian_exists = true;//只要有一个鞍点,就不会输出NONE
}
}
}
if (!andian_exists)
puts("NONE");
return 0;
}
看似繁琐其实不然,这只是两个函数加一个主函数,看完马上就能理解
第一个定义的函数为无类型,是为了判别如果在x行中有一个大于a[x][y]就返回值为false,如果一整行都小于就返回值为true
判别如果在y列中有小于a[x][y]就返回值为false,反之为true;
输入案例
4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9
2
1 7
4 1
这个便是运行结果,可能会有人考虑到为什么不考虑一行中有相等的呢,为什么不考虑n为1的时候呢,我想说的是这些都已经考虑进去了,因为是一个一个数据判别的,所以不需要考虑这些因素,这也是这个方法的优势。
解题思路:先定义两个函数,用于判别一个元素在该行和该列是否都满足条件,是则输出该元素的位置。 如上图;
本片为作者自己整理的思路,用于加深自己的印象。如果有帮到你,那么非常荣幸