鞍点的定义为:鞍点元素是所在行中值最小的元素,是所在列中值最大的元素。
要解决鞍点问题,我们可以对二维数组进行检索,找出每一行中有最小值的元素,然后找出该元素所在列中的最大元素,比较该列的最大元素的值与该元素的值。
但是,必须考虑到,如果一个看似鞍点,但其所在行列却又元素大小与之相等,则这个“鞍点”不满足定义,所以它不是一个鞍点。
综上,我们先判断行列最值,然后判断行列中是否有多个最值,如果有元素满足:既是行最小值又是列最大值,同时该元素所在行列没有元素大小与之相等,则该点是鞍点。
#include "stdio.h" #define V_ONE 3 #define V_TWO 3 int main(void) { int a[V_ONE][V_TWO] = {}; int i = 0, j = 0, k = 0; int row = 0, col = 0; int is_anExist = 0; int *c_max, *r_min; //输入数组元素 for (i = 0; i<V_ONE; i++) { printf("请输入第%d行元素\n", i + 1); for (j = 0; j<V_TWO; j++) { scanf_s("%d", &a[i][j]); } } //查找鞍点 for (i = 0; i < V_ONE; i++) { //将行最小值和列最大值都初始化为每一行第一个值 r_min = &a[i][0]; c_max = &a[0][0]; //查找行最小值,并将指针指向行最小值,记录列 for (j = 1; j < V_TWO; j++) { //初始化 col 的值 col = 0; if (*r_min > a[i][j]) { r_min = &a[i][j]; c_max = &a[0][j]; col = j; } } //如果行最小值有多个,则将col记录为-1 for (j = 0; j < V_TWO; j++) { if (*r_min == a[i][j] && j != col) col = -1; } //查找列最大值,并将指针指向列最大值,记录行 for (k = 1; k < V_ONE; k++) { //初始化row的值 row = 0; if (*c_max < *(c_max + V_TWO)) { c_max = c_max + V_TWO; row = k; } } //如果列最大值有多个,这将row记录为-1 for (k = 0; k < V_ONE; k++) { if (*c_max == a[k][col] && col != -1 && k != row) row = -1; } //若行最小值和列最大值是同一个元素且该元素所在行列没有与之等大的元素,则该元素是鞍点,输出鞍点 if (*r_min == *c_max && row != -1 && col != -1) { printf("鞍点A(%d, %d)的值为:%d\n", row + 1, col + 1, *r_min); is_anExist = 1; } } if (is_anExist == 0) printf("鞍点不存在!\n"); return 0; }