【刷题记录】 UVA400 Unix is 命令

目录

一. 问题描述

二. 题解及代码 


一. 问题描述

Problem Description

输入正整数N以及N个文件名,按照A码排序后按照列优先的方式左对齐输出,假设最长文件名有M字符,其他列都是M+2字符,最右列为M字符。

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

二. 题解及代码 

        从问题来看解题思路不难,只需排序输出即可,但关键是输出排版的规格。虽然是列优先,但输出时仍按照逐行然后逐列输出,此处就出现了跨元素输出,跨元素个数为每一列的元素数c=i+j*row,其中i为行,j为列,row为行数即为每一列元素数。

        关于行数与列数的计算,每一行限定60字符要求最大化列数,尽量少增加行数,我们就把每一行尽可能地填充上60字符,然后判断行数,注意列数可能为零的情况,这时候就要把列更新为1。代码如下:

#include <iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn=100+10;
const int maxcol=60;
void print(string &s,int l)
{
    cout<<setiosflags(ios::left)<<setw(l)<<s;//左对齐l宽度
}
int main()
{
    int n;
    while(cin>>n)
    {
        int k=0;
        string character[maxn];
        for(int i=0; i<n; i++)
        {
            cin>>character[i];
            k=max(k,(int)character[i].size());//找到最大字符长度

        }
        sort(character,character+n);//排序
        int col=0;
        while((k+2)*col<=maxcol)
        {
            col++;//找列数
        }
        col=col-1;//这里可能出现col=0(比如最大字符为59时)
        if(col==0)
            col=1;//变为1
        int row;
        if(n%col==0)
            row=n/col;//找行数
        else
            row=n/col+1;
        int N=0;
        cout<<"------------------------------------------------------------"<<endl;
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                int c=i+j*row;//字符串位置的处理!!!
                if(j==col-1&&c<n)
                    print(character[c],k);
                else if(c<n)
                    print(character[c],k+2);
            }
            cout<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿阿阿安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值