例题5-8 Unixls命令(Unix ls,UVa400)题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/86295685

欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

例题5-8 Unixls命令(Unix ls,UVa400)题目描述

题意解析

输入正整数N以及N个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M个字符,则最右列有M个字符,其他列都是M+2个字符,不够的则在末尾补空格字符。要求输出的每行的总字符数不超过60,且行数最小。

算法设计

可以用vector<string>files来存储每组输入的文件名,输入过程中用M来表示最长文件名的字符数,输入完毕用sort函数进行排序。需要确定输出的行数R和列数C。由于最右列有M个字符,其余列每列M+2个字符,每行最多60个字符且要求行数最小,则求列数C的公式为 C = 1 + ( 60 M ) / ( M + 2 ) C=1+\lfloor (60-M)/(M+2) \rfloor 假设有N个文件名,则求行数R的公式为 R = N / C R=\lceil N/C \rceil
行数列数确定好后,算法就很容易编写了。

C++代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N;
    while(cin>>N){
        string input;
        vector<string>files;//存储文件名
        int M=0;//存储最长文件名的字符数
        while(N--){
            cin>>input;
            M=max(M,(int)(input.size()));
            files.push_back(input);
        }
        sort(files.begin(),files.end());//排序
        int C=1+(60-M)/(M+2),R=(files.size()+C-1)/C;//求列数C和行数R
        for(int i=0;i<60;++i)//输出60个'-'字符
            printf("-");
        puts("");//换行
        for(int i=0;i<R;++i){//输出R行
            for(int j=0;j<C;++j){//每行输出C列
                if(i+j*R>=files.size())
                    continue;
                printf("%s",files[i+j*R].c_str());
                int len=(j==C-1)?M:M+2;
                for(int k=0;k<len-files[i+j*R].size();++k)
                    printf(" ");
            }
            puts("");//换行
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/86295685
5-8