题目
设计一个算法,对给定的一个整型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;
}
运行结果如下: