UVA 400 - Unix ls (Unixls命令)

csdn : https://blog.csdn.net/su_cicada/article/details/86773007

例题5-8 Unixls命令(Unix ls,UVa400) 输入正整数n以及n个文件名,按照字典序排序后按列优先的方式左对齐输出。 假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符。

Sample Input

10

tiny

2short4me

very_long_file_name

shorter

size-1

size2

size3

much_longer_name

12345678.123

mid_size_name

12

Weaser

Alfalfa

Stimey

Buckwheat

Porky

Joe

Darla

Cotton

Butch

Froggy

Mrs_Crabapple

P.D.

19

Mr._French

Jody

Buffy

Sissy

Keith

Danny

Lori

Chris

Shirley

Marsha

Jan

Cindy

Carol

Mike

Greg

Peter

Bobby

Alice

Ruben

Sample Output

------------------------------------------------------------
12345678.123         size-1
2short4me            size2
mid_size_name        size3
much_longer_name     tiny
shorter              very_long_file_name
------------------------------------------------------------
Alfalfa        Cotton         Joe            Porky
Buckwheat      Darla          Mrs_Crabapple  Stimey
Butch          Froggy         P.D.           Weaser
------------------------------------------------------------
Alice       Chris       Jan         Marsha      Ruben
Bobby       Cindy       Jody        Mike        Shirley
Buffy       Danny       Keith       Mr._French  Sissy
Carol       Greg        Lori        Peter

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=341

[注意] 一行最后一个单词后面不要有两个空格

[注意] 每组最后一个单词后面不用空2格

算行数时向上取整

输出时,设置额外的break条件,即已经输出完最后一个,不要继续越界输出

其余看代码

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

/*
[注意] 一行最后一个单词后面不要有两个空格
[注意] 每组最后一个单词后面不用空2格
算行数时向上取整
输出时,设置额外的break条件,即已经输出完最后一个,不要继续越界输出

*/

int main()
{
    int N;
    while(cin>>N){
        vector<string> list;
        int max_len = 0;
        for(int i=0;i<N;i++){
            string str;
            cin>>str;
            max_len = max_len < str.size() ? str.size() : max_len;
            list.push_back(str);
        }

        sort(list.begin(), list.end());
        int count_col = 0;  // 列数
        int count_line = 0; //行数
        count_col = (60+2) / (max_len+2);
        count_line = ceil((double)list.size() / count_col); //[注意]这里除的时候要转换为浮点型
        // cout<<list.size()<<" "<<(double)list.size() / count_col + 0.5<<endl;
        // cout<<max_len<<" "<<count_col<<" "<<count_line<<endl;

        for(int i=0;i<60;i++)
            cout<<"-";
        cout<<endl;
        for(int i=0;i<count_line;i++){     // 第几行
            for(int k=0; k<count_col && (i+k*count_line)<list.size(); k++){  // 第几列, 循环判断条件中,加上判输出单词个数足够
                if(k>0)  //作为两个词块之间间隔的空格,每行第一个之前没有
                    cout<<"  ";

                string out = list[i+k*count_line];
                cout<<out;

                //输出每个单词后面的占位空格 (不算单词块之间2个空格的间隔)
                for(int j=0;j<max_len-out.size();j++)
                    cout<<" ";
            }
            cout<<endl;
        }

    }
    return 0;
}

// AC at 2019/2/2 00:22

没什么难度,注意注意点就行, 感谢 udebug

https://www.udebug.com/UVa/400

原文地址:https://www.cnblogs.com/SuCicada/p/10357026.html

时间: 2024-10-07 06:48:22

UVA 400 - Unix ls (Unixls命令)的相关文章

UVA 400 Unix ls by sixleaves

题目其实很简单,答题意思就是从管道读取一组文件名,并且按照字典序排列,但是输入的时候按列先输出,再输出行.而且每一行最多60个字符.而每个文件名所占的宽度为最大文件名的长度加2,除了输出在最右边的文件名的宽度是最大文件名长度之外.编程实现这个功能,这就是Unix系统下ls命令的一部分而已.具体实现如下.主要学习的技能要点就是如何用偏移位移法来按列输出.如果一个矩阵n行m列,要按照列输出.但是我们知道,编程时候,只能是for(行)在列.所以必须要有一个偏移量来计算这种偏移关系.x = rows *

UVa 400 Unix Is

题意:给出n个字符串,按照字典序排列,再按照规则输出. ===学习的紫书,题目意思很清楚,求列数和行数最开始看的时候木有看懂啊啊啊 列数:即为(60-M)/(M+2)+1;即为先将最后那一列减去,算普通的有多少列,算完了再加上最后一列 行数:可以用紫书里面的(n-1)/cols+1,也可用ceil函数 再将坐标对应成第几个字符串算出来,是像这个图的箭头标示的从上到下- 1 #include<iostream> 2 #include<cstdio> 3 #include<cst

UVa400.Unix ls

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=341 14438645 400 Unix ls Accepted C++ 0.048 2014-10-28 16:11:17 14438408 400 Unix ls Wrong answer C++ 0.048 2014-10-28 15:41:50 14438381 400 Un

Unix ls UVA 400

说说:这道题在开始的时候理解有偏差.其实这道题把unix里的ls命令简化了,这道题的输出格式其实是输出若干列的文件名,且每列占据的字符数是最长的文件名的长度加二,当然最后一列除外,最后一列就是最长的文件名的长度.其实只要将行数从一开始不断的测试,直到输出每行的字符数不超过六十即可.但是我开始理解成要求输出的行数最少,且每列的长度为该列中的最长的文件名的长度加二.这样的话就变得复杂了许多.因为你在计算最少的行数的时候就要统计此种情况下的每列的最长字符数,从而判断每行总的字符数是否会超过六十.原本打

【UVa 400】Unix ls

 Unix ls  The computer company you work for is introducing a brand new computer line and is developing a new Unix-like operating system to be introduced along with the new computer. Your assignment is to write the formatter for the ls function. Your

28 个 Unix/Linux 的命令行神器

28 个 Unix/Linux 的命令行神器 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的.这 些工具都非常不错,希望每个人都知道.本篇文章还在Hacker News上被讨论,你可以过去看看.我以作者的原文中加入了官网链接和一些说明. dstat & sar iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在<性能调优攻略>中提到过那三个

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: 1 /************************************************************************* 2 > File Name: dirwalk.c 3 > Author: 4 > Mail: 5 > Created Time: Tue 31 Mar 2015 11:56:38 AM CST 6 ******************

设置ll和ls -l命令中显示的日期格式

在Linux中使用ll或者ls -l命令过程中,日期的显示总是显示英文日期,觉的很不爽,那么怎么设置显示的格式是按照我们定义的呢? 1.临时更改显示样式,当回话结束后恢复原来的样式 export TIME_STYLE='+%Y-%m-%d %H:%M:%S'    # 直接在命令中执行即可 2.永久改变显示样式,更改后的效果会保存下来 修改/etc/profile文件,在文件内容末尾加入     export TIME_STYLE='+%Y-%m-%d %H:%M:%S' 执行如下命令,使你修改

Unix(AIX) set命令

Unix(AIX) set命令,set命令是shell所具有的,不仅仅是aix自己有的: set -o vi  可以用vi方式操作,用来获取已经输入过的命令: 如果希望自动设置,可以在.profile中直接加入 EDITOR=vi export EDITOR 即可. 学习了:http://www.aixchina.net/Question/79942 用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性.在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o