这个题目,主要是考察格式化输出
还有一个比较难的点就是行和列与数组的转化
// m 为最长字符数
//ceil为相上取整
int col = (60-m)/(m+2)+1
int row = ceil(double(n)/col)
输出的时候 我们一行一行输出,可是题目要求我们按列输出,所以就必须得找到单词数组各个元素和行列的关系,注意越界的情况。(也可以定义二维数组,先排序在输出)
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
if(((i+(j-1)*row)-1)<vs.size()){
if(j==col) cout<<left<<setw(m)<<vs[i+(j-1)*row-1]<<endl;
else cout<<left<<setw(m+2)<<vs[(i+(j-1)*row)-1];
}
else cout<<endl;//如果越界,就直接换行
}
}
代码如下:
//uva 400
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<cmath>
using namespace std;
int main(){
FILE *fin =freopen("xt5-8in.txt","r",stdin);
int n;
while(cin>>n){
cout<<"------------------------------------------------------------"<<endl;
vector<string> vs;
string s;
int m=0;
for(int i=0;i<n;i++){
cin>>s;
vs.push_back(s);
if(m<s.length()) m=s.length();
}
sort(vs.begin(),vs.end());
int col = (60-m)/(m+2)+1;
int row = ceil(double(n)/col);
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
if(((i+(j-1)*row)-1)<vs.size()){
if(j==col) cout<<left<<setw(m)<<vs[i+(j-1)*row-1]<<endl;
else cout<<left<<setw(m+2)<<vs[(i+(j-1)*row)-1];
}
else cout<<endl;
}
}
}
}