这个题本身没什么难度,就是格式控制
vector<string>filenames;
typedef queue<string> Queue;
int main()
{
// freopen("my_ans.txt", "w", stdout);
int n;
while (cin >> n) {
cout << "------------------------------------------------------------\n" ;
filenames.clear(); string longest="";
int num = n;
while (num--) { string name; cin >> name; longest = longest.size() > name.size() ? longest : name; filenames.push_back(name); }
sort(filenames.begin(), filenames.end());
queue<Queue> inOrder;
// 这里注意对行列数目的计算,row计算用n-1避免向上多输出空行,向下少输出数据的尴尬
int column = (60 -longest.size()) / (longest.size()+2) +1, row = (n-1) / column + 1;
for (int i = 0; i < row; i++)
{
Queue q;
for (int j = i, c = 0; j < filenames.size() && c < column; c++, j += row) q.push(filenames[j]);
inOrder.push(q);
}
for (int i = 0; !inOrder.empty(); i++)
{
Queue t = inOrder.front(); inOrder.pop();
int lenthpre = longest.size() + 2.0, lenthtil = longest.size();
bool need = !t.empty();
while (!t.empty())
{
if (t.size() != 1) cout << setiosflags(ios::left) << setw(lenthpre)<< t.front() , t.pop();
else cout << setiosflags(ios::left) << setw(lenthtil) << t.front() , t.pop();
}
if(need) cout << endl;
}
}
return 0;
}
坑点就是row的计算,我反复用ceil函数和round函数修改条件...其实一步解决