考研数据结构之数组(5.6)——练习题之统计矩阵中既是所在行中最小(大)值又是所在列中最小(大)值(C表示)

题目

设计一个算法,对给定的一个整型mxn矩阵A,统计这个矩阵中具有下列特征的元素个数并输出它们的坐标及数值:它们既是所在行中的最小值,又是所在列中的最小值;或者它们既是所在行中的最大值,又是所在列中的最大值。假设矩阵中元素各不相同,要求结果在处理过程中用输出语句输出。

分析

即只需要找出某行上的最小值(最大值),然后判断其是否为对应列的上的最小值(最大值)即可。

代码

核心代码如下:

/* 获取矩阵A中既是所在行最大值,又是所在列最大值的数字的数目、值、行下标和列下标 */
/* A[][MAXSIZE]指的是矩阵;m指的是矩阵的行数;n指的是矩阵的列数 */
void findMax(int A[][MAXSIZE],int m,int n){
	int rowMax;
	int count=0;// 计数器,记录既是所在行最大值又是所在列最大值的数字的数目 
	for(int i=0;i<m;i++){// 遍历行 
		rowMax=A[i][0];// 将每行第一个数赋予为所在行最大值 
		int x=i,y=0;// 记录行最大值的行下标和列下标 
		for(int j=0;j<n;j++){// 遍历列 
			if(A[i][j]>rowMax){// 判断该行的所有元素是否大于设定的rowMax 
				rowMax=A[i][j];// 如果是,则将A[i][j]赋予给rowMax 
				x=i;// 保存行下标 
				y=j;// 保存列下标 
			}
		}
		int temp=rowMax;// 保存行最大值 
		for(int q=0;q<m;q++){// 遍历行 
			if(A[q][y]>rowMax){// 判断行最大值是不是所在列的最大值 
				rowMax=A[q][y];// 如果所在列有值比行最大值大,则将其赋给行最大值 
			}
		}
		if(temp==rowMax){// 故判断temp(保存的行最大值)和比较所在列后的rowMax是否相等,如果相等则证明rowMax既是所在行的最大值也是所在列的最大值 
			count++;// 计数器加1 
			printf("%d,[%d,%d]\n",temp,x,y);// 大于值,及其行下标和列下标 
		}
	}
	printf("既是所在行最大值又是所在列最大值的元素个数为:%d\n",count);// 打印个数 
}

/* 获取矩阵A中既是所在行最小值,又是所在列最小值的数字的数目、值、行下标和列下标 */
/* A[][MAXSIZE]指的是矩阵;m指的是矩阵的行数;n指的是矩阵的列数 */
void findMin(int A[][MAXSIZE],int m,int n){
	int rowMin;
	int count=0;// 计数器,记录既是所在行最小值又是所在列最小值的数字的数目 
	for(int i=0;i<m;i++){// 遍历行 
		rowMin=A[i][0];// 将每行第一个数赋予为所在行最小值 
		int x=i,y=0;// 记录行最小值的行下标和列下标
		for(int j=0;j<n;j++){// 遍历列 
			if(A[i][j]<rowMin){// 判断该行的所有元素是否小于设定的rowMin 
				rowMin=A[i][j];// 如果是,则将A[i][j]赋予给rowMin
				x=i;// 保存行下标 
				y=j;// 保存列下标 
			}
		}
		
		int temp=rowMin;// 保存行最小值 
		for(int q=0;q<m;q++){// 遍历行 
			if(A[q][y]<rowMin){// 判断行最小值是不是所在列的最小值 
				rowMin=A[q][y];// 如果所在列有值比行最小值小,则将其赋给行最小值 
			}
		}
		if(temp==rowMin){// 故判断temp(保存的行最小值)和比较所在列后的rowMin是否相等,如果相等则证明rowMax既是所在行的最大值也是所在列的最大值 
			count++;// 计数器加1 
			printf("%d,[%d,%d]\n",temp,x,y);// 小于值,及其行下标和列下标 
		}
	}
	printf("既是所在行最小值又是所在列最小值的元素个数为:%d\n",count);// 打印个数
}

完整代码如下:

#include<stdio.h>

#define MAXSIZE 20
/* 5.取矩阵A中既是所在行最大值,又是所在列最大值的数字的数目、值、行下标和列下标 */ 

/* 打印矩阵 */
/* A[][MAXSIZE]指的是矩阵;m指的是矩阵的行数;n指的是矩阵的列数 */ 
void printMat(int A[][MAXSIZE],int m,int n){
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			printf("%d\t",A[i][j]);
		}
		printf("\n");
	}
}

/* 获取矩阵A中既是所在行最大值,又是所在列最大值的数字的数目、值、行下标和列下标 */
/* A[][MAXSIZE]指的是矩阵;m指的是矩阵的行数;n指的是矩阵的列数 */
void findMax(int A[][MAXSIZE],int m,int n){
	int rowMax;
	int count=0;// 计数器,记录既是所在行最大值又是所在列最大值的数字的数目 
	for(int i=0;i<m;i++){// 遍历行 
		rowMax=A[i][0];// 将每行第一个数赋予为所在行最大值 
		int x=i,y=0;// 记录行最大值的行下标和列下标 
		for(int j=0;j<n;j++){// 遍历列 
			if(A[i][j]>rowMax){// 判断该行的所有元素是否大于设定的rowMax 
				rowMax=A[i][j];// 如果是,则将A[i][j]赋予给rowMax 
				x=i;// 保存行下标 
				y=j;// 保存列下标 
			}
		}
		int temp=rowMax;// 保存行最大值 
		for(int q=0;q<m;q++){// 遍历行 
			if(A[q][y]>rowMax){// 判断行最大值是不是所在列的最大值 
				rowMax=A[q][y];// 如果所在列有值比行最大值大,则将其赋给行最大值 
			}
		}
		if(temp==rowMax){// 故判断temp(保存的行最大值)和比较所在列后的rowMax是否相等,如果相等则证明rowMax既是所在行的最大值也是所在列的最大值 
			count++;// 计数器加1 
			printf("%d,[%d,%d]\n",temp,x,y);// 大于值,及其行下标和列下标 
		}
	}
	printf("既是所在行最大值又是所在列最大值的元素个数为:%d\n",count);// 打印个数 
}

/* 获取矩阵A中既是所在行最小值,又是所在列最小值的数字的数目、值、行下标和列下标 */
/* A[][MAXSIZE]指的是矩阵;m指的是矩阵的行数;n指的是矩阵的列数 */
void findMin(int A[][MAXSIZE],int m,int n){
	int rowMin;
	int count=0;// 计数器,记录既是所在行最小值又是所在列最小值的数字的数目 
	for(int i=0;i<m;i++){// 遍历行 
		rowMin=A[i][0];// 将每行第一个数赋予为所在行最小值 
		int x=i,y=0;// 记录行最小值的行下标和列下标
		for(int j=0;j<n;j++){// 遍历列 
			if(A[i][j]<rowMin){// 判断该行的所有元素是否小于设定的rowMin 
				rowMin=A[i][j];// 如果是,则将A[i][j]赋予给rowMin
				x=i;// 保存行下标 
				y=j;// 保存列下标 
			}
		}
		
		int temp=rowMin;// 保存行最小值 
		for(int q=0;q<m;q++){// 遍历行 
			if(A[q][y]<rowMin){// 判断行最小值是不是所在列的最小值 
				rowMin=A[q][y];// 如果所在列有值比行最小值小,则将其赋给行最小值 
			}
		}
		if(temp==rowMin){// 故判断temp(保存的行最小值)和比较所在列后的rowMin是否相等,如果相等则证明rowMax既是所在行的最大值也是所在列的最大值 
			count++;// 计数器加1 
			printf("%d,[%d,%d]\n",temp,x,y);// 小于值,及其行下标和列下标 
		}
	}
	printf("既是所在行最小值又是所在列最小值的元素个数为:%d\n",count);// 打印个数
}

int main(){
	int A[][MAXSIZE]={
			{1,2,3},
			{8,5,6},
			{7,8,9}
			};
	int m=3,n=3;
	printMat(A,m,n);
	
	findMax(A,m,n);
	findMin(A,m,n); 
			
	return 0;
}

运行结果如下:

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值