アイデア:
1.マトリックスは、行を横断する、データを介して、二次元配列に格納されているが、処理時間がカラムによって処理されます。
2セットは、二つの最大値は、限り、交換するための第2の最大数よりも大きい数があるので、各置換は確かに二番目に大きい数です。
配列が出力行を維持するために必要なことに留意されたい、すなわち、出力ライン数の最大数は、2つのシーケンスを必要とします。
C ++コード:
1 #include<iostream>
2 #include<string>
3
4 using namespace std;
5
6 const int r=4, c=5;
7 int matrix[r][c];
8 int maxn[c][2];
9 int startNum;
10
11
12 void init() {
13 for(int i=0; i<c; i++) {
14 //int: 32位, 1000...00 为负的最大, 即int表示的最小数值
15 maxn[i][0] = maxn[i][1] = 0x80000000;
16 }
17 }
18
19
20 //寻找最大和次大值
21 void findMaxNum(int row, int column) {
22 for(int k=0; k<column; k++) {
23 for(int i=0; i<row; i++) {
24 //处理对应的列
25 int temp = matrix[i][k];
26 int minNum = min(maxn[k][0], maxn[k][1]);
27 int maxNum = max(maxn[k][0], maxn[k][1]);
28 //每次只替换一个, 所以只有高于第二大值即可保留
29 if(temp > minNum) {
30 //不管替换哪个, 原来最大的数肯定保留, 而且顺序还在前面
31 maxn[k][0] = maxNum;
32 //新来的不管最大还是第二大, 都得排后面
33 maxn[k][1] = temp;
34 }
35 }
36 }
37 }
38
39
40 void solve(int row, int column) {
41 //4*5矩阵数据读取
42 for(int i=0; i<row; i++) {
43 for(int k=0; k<column; k++) {
44 if(!i && !k) {
45 matrix[i][k] = startNum;
46 }else {
47 cin>> matrix[i][k];
48 }
49 }
50 }
51 //挑选每一列的最大值和次大值
52 findMaxNum(row, column);
53 for(int i=0; i<2; i++) {
54 for(int k=0; k<column; k++) {
55 if(k) cout<< " ";
56 cout<< maxn[k][i];
57 }
58 cout<< endl;
59 }
60 }
61
62
63 int main() {
64 while(true) {
65 //初始化
66 init();
67 if(cin>> startNum) {
68 solve(4, 5);
69 }else {
70 break;
71 }
72 }
73
74 return 0;
75 }