#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了