题解
模拟 Unix 的 ls 命令。
输入n以及n个文件名,排序后按照列优先的次序左对齐输出。
注意:
The rightmost column will be the width of the longest filename and all other columns will be the width of the longest filename plus 2.
据此,可以计算输出有多少行和列。
设最长文件名的长度为 maxLen,则
列数:
cols=(maxcol−maxLen)/(maxLen+2)+1
行数:
rows=⌈n/cols⌉⇒(n−1)/cols+1
#include <bits/stdc++.h>
using namespace std;
const int maxcol = 60;
const int maxn = 100 + 5;
string filenames[maxn];
void print(const string &str, int len, char ch)
{
cout << str;
for(int i = 0; i < len - str.length(); ++i)
cout << ch;
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif // LOCAL
for(int n; cin >> n; )
{
int maxLen = 0;
for(int i = 0; i < n; ++i){
cin >> filenames[i];
maxLen = max(maxLen, (int)filenames[i].length());
}
int cols = (maxcol - maxLen) / (maxLen + 2) + 1, rows = (n - 1) / cols + 1; //向上取整
print("", maxcol, '-');
cout << endl;
sort(filenames, filenames + n);
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < cols; ++j)
{
int idx = j * rows + i;
if(idx < n) print(filenames[idx], j == cols - 1 ? maxLen : maxLen + 1, ' ');
}
cout << endl;
}
}
return 0;
}