题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
改进目标:
网络上很多视频和博客都没有考虑到如果某一行最大数值MAX出现相等的情况,极端一点,当数组元素全部相等的时候,所有的点其实都是鞍点,以下程序是我针对这一问题做的一些改进。
ps: 提问了B站讲课的up主老师,他的意思是如果出现一行上最大的元素相等的情况,这个数组就没有鞍点了。因为是最大值,“最”就限定了它不能有多个相同的。有相同的最大值就不是“最”了,只能是最大值之一。
他说的好像也挺有道理,哈哈哈哈,这就属于语文问题了。C语言程序问题很多都有歧义,主要是理解算法思想最重要,我的程序也只是给大家一个小小的参考,如果有其他想法的可以在下面评论区讨论,一起学习进步,欧力给!
#include
#define M 4
#define N 4
//用来存放鞍点坐标的结构体
struct zuobiao
{
int row[M];
int colum[N];
int n;
}zb;
int main() {
int a[M][N] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };//实验数据
//int a[M][N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, };//实验数据
//int a[M][N] = { 1, 2, 3, 4, 5, 6, 7, 9, 9, 0, 1, 7, 3, 4, 5, 6, };//实验数据
int max, min;
int flag1 = 0, flag2 = 0;
int j;
//输出数组
for (int i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
printf("%5d", a[i][j]);
}
printf("\n");
}
//鞍点
for (int i = 0; i < M; i++) {
max = a[i][0];
zb.row[0] = i, zb.colum[0] = 0;
zb.n = 1;
for (j = 1; j < N; j++) {
if (a[i][j] > max) {
zb.n = 1;
max = a[i][j];
zb.row[zb.n -1] = i;
zb.colum[zb.n -1] = j;
}
else if (a[i][j] == max) {
zb.n ++;
max = a[i][j];
zb.row[zb.n - 1] = i;
zb.colum[zb.n - 1] = j;
}
}
min = max;
for (j = 0; j < zb.n; j++){
flag1 = 0;
for (int k = 0; k < M; k++) {
if (a[k][zb.colum[j]] < min) {
flag1 = 1;
break;
}
}
if (!flag1) {
flag2 = 1;
printf("鞍点%d的行: %d 列: %d\n", max, zb.row[j], zb.colum[j]);
}
}
}
if (!flag2) {
printf("该数组没有鞍点\n");
}
return 0;
}