2014年12月8日星期一

[UVa] 400 - Unixls

奇怪的是,題目說最右邊欄的寬度是最大檔名長,但輸出時卻都要+2才會過...



/*-----------------------------------------------------*/
/*參考程式競賽與演算法入門經典P.5-32內容               */
/*-----------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int max_col = 60; //最大行數
const int maxn = 105; //檔案名稱最大長度
string filenames[maxn];

int main(){
  freopen("input.txt", "r", stdin);
  int n=0;
  while(cin >> n){
    int M = 0;  //檔案名稱最長長度
    for(int i=0;i<n;i++){
      cin >> filenames[i];
      if((int)filenames[i].length()>M) M = filenames[i].length();
    }
    sort(filenames, filenames+n); //sort
    for(int i=0;i<60;i++)printf("-");
    printf("\n");    
    //行數=最大行數減最大檔名,除上最大檔名加2(得到除最後一行的行數)
    //再把最後一行加回來的數即是
    int cols = (max_col-M)/(M+2) + 1;
    int rows = n/cols; 
    if(n%cols==0); else rows++; //無條件進位

    int flag;
    for(int r=0;r<rows;r++){
      for(int c=0;c<cols;c++){
        flag = c*rows+r; //直接計算出位置
        if(flag < n)cout << filenames[flag];
        for(int i=0; i<M-(int)filenames[flag].length() ;i++)cout << " ";
        cout << "  ";
      }
      cout << "\n"; 
    }
  }


  return 0;
}

沒有留言: