输入描述:
接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
输出描述:
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
示例1
输入
1 2 4 9 8
-1 4 9 8 8
12 9 8 7 0
7 8 9 7 0
输出
12 9 9 9 8
7 8 9 8 8
#include <stdio.h>
#include <math.h>
#include <string.h>
#define MIN -1000000
int main (){
int a[4][5]={};
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
scanf("%d",&a[i][j]);
}
}
for(int j=0;j<5;j++){
//查找并记录每列最小值及次小值
int m1=a[0][j] ,m2 =a[1][j];
for(int i=1 ;i<4;i++){
if(a[i][j]<m2){//先比较m2 因为m1是最小的 应该要后确定
m2=a[i][j];
}
if(a[i][j]<m1){
m2=m1;
m1=a[i][j];
}
}
//最小的往后移 最大和次大的数之间没有比较 所以不存在两两交换导致的错位问题
for(int k=0;k<4;k++){
if(a[k][j]==m1&&k+1<=3){//k<3才需要交换
a[k][j]=a[k+1][j];
a[k+1][j]=m1;
}
}
//次小的往后移
for(int l=0;l<3;l++){
if(a[l][j]==m2&&l+1<=2){ //k<2才需要交换
a[l][j]=a[l+1][j];
a[l+1][j]=m2;
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<5;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}