您的位置:首页 > 其它

UVa 400 - Unix ls

2014-03-04 22:46 351 查看
题目链接:UVa 400 - Unix ls

题目本身不难,困难的地方在输出,感觉这题目没啥意思。

简单地说一下怎么计算行数和列数。

列数:想象最后一列也是最长文件名长度+2,那么对应的行长度60也得+2,这样显然就很容易计算了。

行数:首先想到肯定是N/列数,仔细想想其实这是“满”的时候,那么不满的时候应该是(N/列数)+1,结合着两种情况可以发现都可以用((N-1)/列数)+ 1表示,化简一下就有了代码中计算行数的式子。

注意一下strlen的返回值是size_t类型的,想用max时候需要强制转换为int类型的。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <iomanip>

using namespace std;

const int MAX_N = 100 + 10;
const int MAX_M = 60 + 5;

int cmp(const void *_a,const void *_b)
{
    char *a = (char*)_a;
    char *b = (char*)_b;
    return strcmp(a,b);
}
int N;
char c[MAX_N][MAX_M];
int len;

int main()
{

    while(cin>>N)
    {
        len = 0;
        for(int i = 0;i < N;i++)
        {
            cin>>c[i];
            len = max(len,(int)strlen(c[i]));
        }

        qsort(c,N,sizeof(c[0]),cmp);
        cout<<"------------------------------------------------------------"<<endl;
        int _len = len + 2;
        int _col = (60 + 2) / _len;
        int _row = (N + _col - 1) / _col;
        for (int i = 0; i < _row; i++)
        {
            for (int j = 0; j < _col; j++)
            {
                if (j * _row + i < N)
                    cout<<left<<setw(_len)<<c[j * _row + i];
            }
            cout<<endl;
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: