C语言鞍点数组改进版

题目内容:

给定一个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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值