题目连接
http://acm.hust.edu.cn/vjudge/problem/19295
Sample Input
19
Mr._French
Jody
Buffy
Sissy
Keith
Danny
Lori
Chris
Shirley
Marsha
Jan
Cindy
Carol
Mike
Greg
Peter
Bobby
Alice
Ruben
Sample Output
. ————————————————————
Alice Chris Jan Marsha Ruben
Bobby Cindy Jody Mike Shirley
Buffy Danny Keith Mr._French Sissy
Carol Greg Lori Peter
题意
给出许多文件名,把他们按字典序排序后,按左对齐的方式,从左往右输出,最长的字符串为x,最右边的字符串占x,其余都占x+2个位置。
题解
开始没有弄懂题意,这个表格的宽度是60个字符是给定的,所以可以根据最长的字符串长度来算出表格的宽度与长度。但是打印的时候本弱鸡又不知道怎么可以打出从左往有,从上到下的顺序…可以由行列数计算出在数组中的位置(x,y)的是s[y*row+x],x与y都是从0开始。要判断y *row+x是否已经大于n了…没有反应过来这个值是可以大于给定的字符串个数的。T了好久。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{ freopen("out.txt","w",stdout);
int n,i;
while(cin>>n)
{
string st;
vector<string>s;
int cnt=0;
for( i=0;i<n;i++)
{
cin>>st;
int z=st.length();
cnt=max(cnt,z);
s.push_back(st);
}
sort(s.begin(),s.end());
for(int i=0;i<60;i++)
cout<<'-';
cout<<'\n';
int col,row;
col=((60-cnt)/(cnt+2))+1;
if(n%col==0)row=n/col;
else row=(n/col)+1;
int k,j;
for( i=0;i<row;i++)
{
for( j=0;j<col;j++)
{
k=j*row+i;
if(k<n){
if(i==col-1)
{
cout<<s[k];
for(int jj=0;jj<cnt-s[k].length();jj++)cout<<' ';
}
else
{
cout<<s[k];
int nn=cnt+2-s[k].length();
for(int jj=0;jj<cnt+2-s[k].length();jj++)cout<<' ';
}
}
}
printf("\n");
}
}
return 0;
}