[数据结构] 输出一个矩阵的所有鞍点

问题描述:

找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。

我的思路:

1,首先找出第一行中的最大值。
2,然后再找出当前行中与最大值相等的值(即一行中出现多个最大值的情况)
3,把找到的最大值及其所在列保存到数组中。
4,依次扫描最大值所在列有没有更小的值。
5,如果没有则打印当前鞍点。

测试结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要代码:

void JZAD(int a[][4],int m,int n){
	int max[10],k[10],l;//用于存放当前行的最大值及其列号,l为下标
	for(int i=0;i<m;i++){//逐行处理
		l=0; max[l]=a[i][0]; k[l]=0; //初始化为第一个元素 
		for(int j=1;j<n;j++){//查找当前行最大值并储存 
			if(a[i][j]>max[l]){//如找到更大的,则替换 
				max[l]=a[i][j];
				k[l]=j; 
			}
		} //这一轮可确定当前行中列号较小的最大值,
//		printf("==a[%d][%d]=%d\n",i,k[l],max[l]);
		//如果有多个最大值,必然在此最大值之后,且等于当前最大值
		for(int j=k[l];j<n;j++){
			if(a[i][j]==max[l]&&j!=k[l]){//如果有多个相同的最大值
				max[++l]=a[i][j];
				k[l]=j; //注意不要重复后移下标 l 
//				printf("==a[%d][%d]=%d\n",i,k[l],max[l]);
			}
		} //这一轮可以找出当前行的所有最大值,
		while(l!=-1){//l 代表了每个最大值的下标 l+1为最大值的个数 
			int j;
			for(j=0;j<m;j++) {//验证行最大值是不是列最小值 
				if(a[j][k[l]]<max[l]) //如果当前列有更小的元素,则验证失败
					break; 
			}//验证完一个;
			if(j==m) printf("a[%d][%d]=%d\n",i,k[l],max[l]);
			//验证成功,打印
			l--;//下标前移,查找下一个 
//			printf("=%d=\n",l);
		} 	
	} 
} 

主函数部分:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void JZAD(int[][4],int m,int n);
main()
{
	int a[][4]={6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			printf("%d	",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	JZAD(a,4,4);
	return 0;
} 

希望对你有所帮助!

封面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀周周~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值