需要注意的地方:格式:
假设最长文件名有M个字符,那么每输出一个单词,就要补齐空格到M个字符,此外,每两个单词之间添加两个空格
例:M=3,有aaa、bb、c三个单词,输出应该是下面这样
aaa空空c空空
bb空
“按行输出”计算下标:index = r * cols + c
“按列输出”计算下标:index = c * rows + r
下面是非常愚蠢的代码,比书上的代码又费时又费空间:
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
//freopen("C:\\Users\\Summer\\Desktop\\input.txt", "r", stdin);
//freopen("C:\\Users\\Summer\\Desktop\\output.txt", "w", stdout);
int n;
int maxcol;
int maxrow;
int maxlength = 0;
string s;
vector<string> filelist;
vector<queue<string>> output;
while(scanf("%d", &n)!=EOF) {
maxlength = 0;
filelist.clear();
while(n--) {
cin>>s;
int l = s.length();
maxlength = max(maxlength, l);
filelist.push_back(s);
}
sort(filelist.begin(), filelist.end());
maxcol = (int)62/(maxlength+2);
maxrow = (filelist.size()-1)/maxcol+1;
for(int i=0; i<maxcol; i++)
output.push_back(queue<string>());
for(int i=0; i<filelist.size(); i++) {
output[i/maxrow].push(filelist[i]);
}
cout<<"------------------------------------------------------------"<<endl;
for(int i = 0; i < maxrow; i++) {
for(int j = 0; j < output.size(); j++) {
if(output[j].empty()) break;
else {
if(j) cout<<" ";
cout<<(output[j].front());
for(int k = output[j].front().length(); k<maxlength; k++) cout<<' ';
output[j].pop();
}
}
cout<<endl;
}
}
return 0;
}