题意:给出n个字符串,排成阵列,要求每行长度不超过60,且每列宽度为n个字符串中最长的那个的长度加2,最后一列就是最长的长度,要使行数尽可能少。
题解:直接推导出最后需要多少行多少列,细心一点就没问题了。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char file[102][102][65]; 6 struct data 7 { 8 char s[70]; 9 bool operator<(const data &ne)const 10 { 11 return strcmp(s,ne.s)<0; 12 } 13 }po[102]; 14 int main() 15 { 16 int n,r,c,mlen; 17 while(scanf("%d",&n)!=EOF) 18 { 19 memset(file,'\0',sizeof(file)); 20 mlen=0; 21 for(int i=0;i<n;i++) 22 { 23 scanf("%s",po[i].s); 24 mlen=max(mlen,(int)strlen(po[i].s)); 25 } 26 sort(po,po+n); 27 c=(60-mlen)/(mlen+2)+1; 28 r=n/c+(n%c!=0); 29 int nu=0; 30 for(int i=0;i<c&&nu<n;i++) 31 for(int j=0;j<r&&nu<n;j++) 32 strcpy(file[j][i],po[nu++].s); 33 puts("------------------------------------------------------------"); 34 for(int i=0;i<r;i++) 35 { 36 for(int j=0;j<c;j++) 37 { 38 if(file[i][j][0]!='\0') 39 printf("%s",file[i][j]); 40 int k=strlen(file[i][j]); 41 while(k<mlen) 42 putchar(' '),k++; 43 if(j==c-1) 44 printf("\n"); 45 else 46 printf(" "); 47 } 48 } 49 } 50 return 0; 51 }