例题5-8 Unix ls 命令 UVa400

来源:互联网 发布:测试交换机端口带宽 编辑:程序博客网 时间:2024/05/17 08:19
算法竞赛入门经典(第2版) 第5C++与STL入门

题5-8 Unix ls 命令  UVa400

感悟。

1、从网站下载英文原题,重点在看输入输出数据与格式。

2、英文大意看懂,但在输出文件内容列数的变化规律没摸清。

3、反复读题,猜测大意,是符合条件的列,组合成行,尽可能的多,占领一行(每行60字符)。The rightmost column will be the width of the longest filename and all other columns will be the width of the longest filename plus 2. There will be as many columns as will fit in 60 characters.文中输出的文件列数决定因素。

样例1:

M=19

n*(M+2)+M=60=>n=1,故样例1有两列,每列文件数(10+2-1)/2=5

样例2:

M=12

n*(M+2)+M=60=>n=3,故样例2有四列,每列文件数(12+4-1)/4=3

样例3:

M=9

n*(M+2)+M=60=>n=4,故样例3有五列,每列文件数(19+5-1)/5=4

4、用set存储文件名,按3、进行输出。

5、通过http://blog.csdn.net/u010902721/article/details/45771597复习了set中迭代器的用法,注意:

it<input.end()错误;it!=input.end()正确。

6、突然发现,字符串是一行一行输出的,怎样将一个系列的字符串按行列有序输出,看来得费些功夫。

7、准备引入vector进行处理。

8、睡了一觉,很快将一维字符串数组表示成二维表格形式,稍加调试,样例通过,在http://vjudge.net上提交AC,再一次,一次提交AC,在https://uva.onlinejudge.org/提交AC,看了看时间2016-11-24

9、扫了一遍书中代码,核心思想比较接近。但代码写起来,差异还是比较大的。

附上AC代码,编译环境Dev-C++4.9.9.2

#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main(){
    int n;
    
    while(cin>>n){
        set<string> input;
        string filename;
        int row,col;
        int len;
        int maxlen=0;
        int count=0;
        int size;
        vector<string> vec;
        int i,j,k,m;
        for(i=0;i<n;i++){
            cin>>filename;
            len=filename.length();
            if(maxlen<len)//查找最长文件名的长度
                maxlen=len;
            input.insert(filename);
        }
        col=(60-maxlen)/(maxlen+2)+1;
        row=(n+col-1)/col;
        cout<<"------------------------------------------------------------"<<endl;
        //迭代器
        for(set<string>::iterator it=input.begin();it!=input.end();it++){//it<input.end()错误
            vec.push_back(*it);
        }
        //打印字符串
        size=vec.size();
        for(i=0;i<row;i++){
            for(j=0;j<col;j++){
                k=i+j*row;//注意是j*row而不是j*col
                if(k<size){//字符串处理
                    string stmp=vec[k];
                    int begin,end;
                    begin=stmp.length();
                    
                    if(j<=col-2){//除最后一列外
                        end=maxlen+2;
                    }else{//最后一列
                        end=maxlen;
                    }
                    
                    for(m=begin;m<end;m++){//通过加空格来补齐
                        stmp+=" ";
                    }
                    cout<<stmp;
                }
                    
            }
            cout<<endl;
        }
    }
    return 0;
}




0 0
原创粉丝点击