题意:输入正整数n(1<=n<=100)以及n个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符。每行最多60个字符。
思路:排个序。然后计算行数和列数。输出的时候我们按行输出的话很简单,但是这个题要按列输出,我们可以发现按列输出也是有规律的,即假设要输出r行的第c个元素他在数组中的位置应该为c * rows + r,注意要判断是否越界(即>=n)。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 5;
const int maxcol = 60;
string filenames[maxn];
void print(const string& s, int len, char extra)
{
cout << s;
for(int i = s.length(); i < len; i++)
{
cout << extra;
}
}
int main()
{
int n;
while (cin >> n)
{
int M = 0;
for (int i = 0; i < n; i++)
{
cin >> filenames[i];
M = max(M, (int)filenames[i].length());
}
sort(filenames, filenames + n);
int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
print("", 60, '-');
cout << endl;
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
int idx = c * rows + r;
if (idx < n) print(filenames[idx], c == cols - 1 ? M : M + 2, ' ');
}
cout << endl;
}
}
return 0;
}