目录
一. 问题描述
Problem Description
输入正整数N以及N个文件名,按照A码排序后按照列优先的方式左对齐输出,假设最长文件名有M字符,其他列都是M+2字符,最右列为M字符。
Sample Input
10
tiny
2short4me
very_long_file_name
shorter
size-1
size2
size3
much_longer_name
12345678.123
mid_size_name
12
Weaser
Alfalfa
Stimey
Buckwheat
Porky
Joe
Darla
Cotton
Butch
Froggy
Mrs_Crabapple
P.D.
19
Mr._French
Jody
Buffy
Sissy
Keith
Danny
Lori
Chris
Shirley
Marsha
Jan
Cindy
Carol
Mike
Greg
Peter
Bobby
Alice
Ruben
Sample Output
------------------------------------------------------------
12345678.123 size-1
2short4me size2
mid_size_name size3
much_longer_name tiny
shorter very_long_file_name
------------------------------------------------------------
Alfalfa Cotton Joe Porky
Buckwheat Darla Mrs_Crabapple Stimey
Butch Froggy P.D. Weaser
------------------------------------------------------------
Alice Chris Jan Marsha Ruben
Bobby Cindy Jody Mike Shirley
Buffy Danny Keith Mr._French Sissy
Carol Greg Lori Peter
二. 题解及代码
从问题来看解题思路不难,只需排序输出即可,但关键是输出排版的规格。虽然是列优先,但输出时仍按照逐行然后逐列输出,此处就出现了跨元素输出,跨元素个数为每一列的元素数c=i+j*row,其中i为行,j为列,row为行数即为每一列元素数。
关于行数与列数的计算,每一行限定60字符要求最大化列数,尽量少增加行数,我们就把每一行尽可能地填充上60字符,然后判断行数,注意列数可能为零的情况,这时候就要把列更新为1。代码如下:
#include <iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn=100+10;
const int maxcol=60;
void print(string &s,int l)
{
cout<<setiosflags(ios::left)<<setw(l)<<s;//左对齐l宽度
}
int main()
{
int n;
while(cin>>n)
{
int k=0;
string character[maxn];
for(int i=0; i<n; i++)
{
cin>>character[i];
k=max(k,(int)character[i].size());//找到最大字符长度
}
sort(character,character+n);//排序
int col=0;
while((k+2)*col<=maxcol)
{
col++;//找列数
}
col=col-1;//这里可能出现col=0(比如最大字符为59时)
if(col==0)
col=1;//变为1
int row;
if(n%col==0)
row=n/col;//找行数
else
row=n/col+1;
int N=0;
cout<<"------------------------------------------------------------"<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
int c=i+j*row;//字符串位置的处理!!!
if(j==col-1&&c<n)
print(character[c],k);
else if(c<n)
print(character[c],k+2);
}
cout<<endl;
}
}
return 0;
}