#include <iostream>
#include <cstring>
using namespace std;
int main() {
int matrix[4][5];
int matrix_copy[4][5];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
cin >> matrix[i][j];
}
}
//注意两个变量的位置
memcpy(matrix_copy,matrix,4*5*sizeof(int));
//2 3 4与第一行对比
int n = 0;
//用于记录每一列最大值的行标
int res[2][5];
for(int i = 0; i<2; i++) {
for(int j = 0; j < 5; j++) {
res[i][j] = 0;
}
}
//冒泡排序
while (n < 2) {
for (int j = 0; j < 5; j++) {
int minInx = 0;
for (int i = 1; i < 4; i++) {
//记录最大值的下标
if (matrix[i][j] > matrix[res[n][j]][j]) {
res[n][j] = i;
}
//记录最小值的下标
if(n==0 && matrix[i][j] < matrix[minInx][j]) {
minInx = i;
}
}
//将最大值替换成最小值,次大值变为最大值,又转换为寻找最大值的下标
if(n==0) matrix[res[0][j]][j] = matrix[minInx][j];
}
n++;
}
for(int j = 0 ; j < 5; j++){
if(res[0][j] > res[1][j])
swap(res[0][j],res[1][j]);
}
for(int i = 0 ; i < 2; i++){
for(int j = 0 ; j < 5; j++){
cout<<matrix_copy[res[i][j]][j]<<" ";
}
cout<<endl;
}
return 0;
}
1、memcpy一定要注意两个变量的位置,目的变量在前,原变量在后
2、算法思想:逐列采用冒泡排序,用res记录最大值的下标,在冒泡排序的同时记录每一列最小值的下标,第一趟结束后res记录了每一列的最大值下标,同时minInx记录了每一列最小值的下标,将最大值替换为最小值后,次大值又变为了最大值,再进行一趟冒泡,记录最新的最大值(之前为次大值)的下标,这样两趟下来,res就记录了最大值和次大值的坐标,根据indx排序后输出,ac了

京公网安备 11010502036488号