已解决
C语言鞍点数组改进版
来自网友在路上 166866提问 提问时间:2023-10-31 23:46:41阅读次数: 66
最佳答案 问答题库668位专家为你答疑解惑
题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
改进目标:
网络上很多视频和博客都没有考虑到如果某一行最大数值MAX出现相等的情况,极端一点,当数组元素全部相等的时候,所有的点其实都是鞍点,以下程序是我针对这一问题做的一些改进。
ps: 提问了B站讲课的up主老师,他的意思是如果出现一行上最大的元素相等的情况,这个数组就没有鞍点了。因为是最大值,“最”就限定了它不能有多个相同的。有相同的最大值就不是“最”了,只能是最大值之一。
他说的好像也挺有道理,哈哈哈哈,这就属于语文问题了。C语言程序问题很多都有歧义,主要是理解算法思想最重要,我的程序也只是给大家一个小小的参考,如果有其他想法的可以在下面评论区讨论,一起学习进步,欧力给!
#include<stdio.h>
#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;
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"C语言鞍点数组改进版":http://eshow365.cn/6-29096-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!