天天看點

UVa 400 Unix的ls指令

題目:題目是要對輸入的每組檔案名進行規則化輸出,除了最後一列,其他列的寬度為maxlen+2,最後一列寬度為maxlen。maxlen為最長字元串的長度。(這個題看了好幾遍都沒看懂題意,最後google出來的才從部落格明白此題題意。。之前自己一直是在數每列最長字元串後的空格數,總是明白不了題意。The rightmost column will be the width of the longest filename and all other columns will be the width of the longest filename plus 2.)

思路:對字元串排序,然後計算相應長度,得出maxlen。現在需要确定列數和行數。列數:設有n+1列。則(maxlen+2)*n+maxlen<=60,則n<=(60-maxlen)/(maxlen+2),n是整數,且n需要最大化,則n即為右邊值。行數:對( q 除以 lie )取上整,這裡的q是總共字元串數。這裡是從左往右排,一列排滿了再排下一列。

注意:總是在輸入資料的for循環裡對剛輸入的資料進行strlen啊或字母排序處理,結果這個for循環結束之後,又對它進行了qsort,則導緻不一一對應了。(錯兩次了,上次好像是邊輸入邊對副本進行字母排序了,出了循環又qsort了,不能一一對應)

Code:

//#define LOCAL
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<math.h>
#define M 110
#define N 70

int cmp_string(const void *_a, const void *_b);

char fname[M][N];
int flen[M];

int main()
{
 #ifdef LOCAL
  freopen("data400.in","r",stdin);
  freopen("data400.out","w",stdout);
 #endif   
    
 int n;
 while(scanf("%d",&n)!=EOF)
 {
  printf("------------------------------------------------------------\n");
  int maxlen=0;
  for(int i=0;i<n;++i)
   scanf("%s",fname[i]);   
  qsort(fname,n,sizeof(fname[0]),cmp_string);  
  for(int i=0;i<n;++i)
  {//注意這裡這兩句應該在qsort後執行,不要寫在上個輸入資料的循環裡了 
   flen[i]=strlen(fname[i]);
   maxlen=maxlen>flen[i]?maxlen:flen[i];       
  }
  
  int lie=(60-maxlen)/(maxlen+2)+1;
  int row=(int)ceil((n+0.0)/lie);
  //fprintf(stderr,"lie:%d\n",lie);
  //fprintf(stderr,"row:%d\n",row);
  for(int i=0;i<row;++i)
   for(int j=0;j<lie;++j)
   {
    int x=j*row+i;
    if(x<n)
     printf("%s",fname[x]);
    if(j!=lie-1)
    {
     //fprintf(stderr,"maxlen:%d\n",maxlen);
     //fprintf(stderr,"%s %d\n",fname[x],flen[x]);
     //fprintf(stderr,"n:%d\n",n); 
     for(int k=flen[x];k<maxlen+2;++k)
      printf(" ");
    }
    else
    {
     for(int k=flen[x];k<maxlen;++k)
      printf(" ");   
     printf("\n");
    }//else      
   }//for         
 }//while
 return 0;   
} 

int cmp_string(const void *_a, const void *_b)
{
 char *a=(char*)_a;
 char *b=(char*)_b;
 return strcmp(a,b);   
}