【刘汝佳书】例题5-8 UVA400(按列输出)

需要注意的地方:格式:
假设最长文件名有M个字符,那么每输出一个单词,就要补齐空格到M个字符,此外,每两个单词之间添加两个空格
例:M=3,有aaa、bb、c三个单词,输出应该是下面这样
aaa空空c空空
bb空

“按行输出”计算下标:index = r * cols + c
“按列输出”计算下标:index = c * rows + r

下面是非常愚蠢的代码,比书上的代码又费时又费空间:

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int main()
{
    //freopen("C:\\Users\\Summer\\Desktop\\input.txt", "r", stdin);
    //freopen("C:\\Users\\Summer\\Desktop\\output.txt", "w", stdout);

    int n;
    int maxcol;
    int maxrow;
    int maxlength = 0;
    string s;
    vector<string> filelist;
    vector<queue<string>> output;

    while(scanf("%d", &n)!=EOF) {
        maxlength = 0;
        filelist.clear();

        while(n--) {
            cin>>s;
            int l = s.length();
            maxlength = max(maxlength, l);
            filelist.push_back(s);
        }

        sort(filelist.begin(), filelist.end());

        maxcol = (int)62/(maxlength+2);
        maxrow = (filelist.size()-1)/maxcol+1;

        for(int i=0; i<maxcol; i++)
            output.push_back(queue<string>());
        for(int i=0; i<filelist.size(); i++) {
            output[i/maxrow].push(filelist[i]);
        }

        cout<<"------------------------------------------------------------"<<endl;
        for(int i = 0; i < maxrow; i++) {
            for(int j = 0; j < output.size(); j++) {
                if(output[j].empty()) break;
                else {
                    if(j) cout<<"  ";
                    cout<<(output[j].front());
                    for(int k = output[j].front().length(); k<maxlength; k++) cout<<' ';
                    output[j].pop();
                }
            }
            cout<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/89032960