这题也就只能算是个STL小练习吧,没有任何思维上难度,
还是比较简单的,(虽然我的程序还是没有刘汝佳的简洁。。。,表示依旧没有这样把一些步骤定义成函数的习惯)直接放代码吧。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
vector<string> s;
int main()
{
freopen("New Text Document.txt","r",stdin);
freopen("Output.txt","w",stdout);
ios::sync_with_stdio(false);
int n;
string str;
while(cin>>n)
{
cout<<"------------------------------------------------------------"<<endl;
cin.get();
int max = 0;
s.clear();
for(int i = 0; i < n; i++)
{
getline(cin, str);
s.push_back(str);
//cout<<str<<endl;
if(str.length() > max) max = str.length();
}
int row = (60+2) / (max+2);
sort(s.begin(), s.end());
int line = s.size() / row;
if(line*row != s.size()) line++;
for(int i = 1; i <= line; i++)
{
for(int j = 1 ; j <= row; j++)
{
int pos = (j-1)*line+i;
if(pos-1<s.size())
{
cout<<s[pos-1];
for(int i = s[pos-1].length(); i < max; i++) cout<<" ";
}
if(j!=row) cout<<" ";
}
cout<<endl;
}
}
return 0;
}
下面是刘汝佳标程。
// UVa400 Unix ls
// Rujia Liu
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxcol = 60;
const int maxn = 100 + 5;
string filenames[maxn];
// 输出字符串s,长度不足len时补字符extra
void print(const string& s, int len, char extra) {
cout << s;
for(int i = 0; i < len-s.length(); 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());
}
// 计算列数cols和行数rows
int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
print("", 60, '-');
cout << "\n";
sort(filenames, filenames+n);
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 << "\n";
}
}
return 0;
}