- 题目描述:
-
输入一个四行五列的矩阵,找出每列最大的两个数。
- 输入:
-
输入第一行包括一个整数n(1<=n<=1000),接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
- 输出:
-
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
- 样例输入:
-
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
- 提示:
-
每个数字后面都要输出一个空格
思路:
最值问题,算法O(N)。
代码:
#include <stdio.h>
#include <string.h>
#define M 4
#define N 5
int main(void)
{
int i, j, k, n, tmp;
int a[M][N], f[M][N];
while (scanf("%d", &n) != EOF)
{
while ((n--)>0)
{
for (i=0; i<M; i++)
{
for (j=0; j<N; j++)
{
scanf("%d", &a[i][j]);
f[i][j] = i;
}
}
for (j=0; j<N; j++)
{
for (i=0; i<M-1; i++)
{
for (k=0; k<M-1-i; k++)
{
if (a[k][j] < a[k+1][j])
{
tmp = a[k][j];
a[k][j] = a[k+1][j];
a[k+1][j] = tmp;
tmp = f[k][j];
f[k][j] = f[k+1][j];
f[k+1][j] = tmp;
}
}
}
}
for (i=0; i<2; i++)
{
for (j=0; j<N; j++)
{
if (f[0][j] < f[1][j])
printf("%d ", a[i][j]);
else
printf("%d ", a[1-i][j]);
}
printf("
");
}
}
}
return 0;
}
/**************************************************************
Problem: 1200
User: liangrx06
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/