2015年8月4日 星期二

[UVA] 400 - Unix ls

題意:
輸入多個字串,
以最長字串的格子數+2為每一個字串可輸出的格子數,
以字典序先由上而下再從左到右輸出,
也就是以行為主!
每一列最長60字元。

方法:
先找出最長字串,
因為每個字串的格子數固定,
所以可以算出每一列最多可以放幾個字串,
再把它一個一個放進一個二維陣列,
注意是以行為主喔!
再以列為主輸出二維陣列的字串就好。

/* 20150803
 * hanting
 * UVa 400 - Unix ls
 * C++
 */
#include <iostream>
#include <vector>
#include <algorithm>//sort
#include <iomanip>//setw
using namespace std;
int main()
{
    int N;
    while(cin>>N)
    {
        cout<<"------------------------------------------------------------"<<endl;
        vector<string> vec(N);
        int maxi=0;
        for(int i=0;i<N;i++)
        {
            cin>>vec[i];
            if(maxi<vec[i].size()) maxi=vec[i].size();
        }
        sort(vec.begin(),vec.end());
        int w;//欄位
        int h;//列
        w=(60-maxi)/(maxi+2)+1;
        h=N/w+(N%w ? 1 : 0);
        string output[h][w];
        int x=0;
        for(int i=0;i<w and x<vec.size();i++)
        {
            for(int j=0;j<h and x<vec.size();j++)
            {
                output[j][i]=vec[x++];
            }
        }

        for(int i=0;i<h;i++)
        {
            for(int j=0;j<w;j++)
            {
                cout<<setw(j!=w-1 ? maxi+2 : maxi)<<left<<output[i][j];
            }cout<<endl;
        }
    }
    return 0;
}

沒有留言:

張貼留言