题目大意:按顺序排列文件名,并按照规则输出。规则:1、以最长文件名的长度len为标准,最后一列文件名的所占长度为len,其他各列文件名长度为len+2;2、文件名从上到下排列,取最少行数。
图像解释:
解题过程:一次AC
正确代码:
# include <cstdio>
# include <cstdlib>
# include <cstring>
# include <ctype.h>
# include <string>
# include <cmath>
# include <sstream>
//# define LOCAL
using namespace std;
char filename[100][60];
int cmp(const void * a,const void *b){
return strcmp(*(char(*)[60])a,*(char(*)[60])b);
}
int main(){
# ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n;
// printf("kaishishuru\n");
while(scanf("%d",&n)!=EOF){
int len=0;
int r=0;
int c=0;
for(int i=0;i<n;i++){
scanf("%s",filename[i]);
if(strlen(filename[i])>len) len=strlen(filename[i]);
}
qsort(filename,n,sizeof(filename[0]),cmp);
// for(int i=0;i<n;i++) printf("%s ",filename[i]);
// printf("\n%d",len);
for(int i=0;i<60;i++){
printf("-");
}
printf("\n");
c=60/(len+2);
int mod=60%(len+2);
if(mod>=len) c++;
r=ceil((double)n/c);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
int order=i+j*r;
if(order<n){
printf("%s",filename[order]);
if(j==c-1){
for(int k=0;k<len-strlen(filename[order]);k++) printf(" ");
}
else{
for(int k=0;k<len+2-strlen(filename[order]);k++) printf(" ");
}
}
}
printf("\n");
}
}
return 0;
}