首页 > 技术文章 > [刷题]算法竞赛入门经典(第2版) 5-1/UVa1593 - Alignment of Code

xienaoban 2016-08-17 18:10 原文

书上具体所有题目:http://pan.baidu.com/s/1hssH0KO


代码:(Accepted,0 ms)

//UVa1593 - Alignment of Code
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<iomanip>
using namespace std;

vector<string> text[1009];
int num[100] = { 0 }, X = 0;
char line[200];

int main()
{
    //freopen("in.txt", "r", stdin);
    while (cin.getline(line, 200)) {
        istringstream in(line);
        istream_iterator<string> fi(in), eof;
        int y = 0;
        while (fi != eof) {
            text[X].push_back(*fi);
            num[y] = max(num[y], (int)fi->size());
            ++y, ++fi;
        }
        ++X;
    }
    for (int i = 0;i < X;++i) {
        int t = text[i].size() - 1;
        for (int j = 0;j < t;++j)
            cout << left << setw(num[j] + 1) << text[i][j];
        cout << *(text[i].rbegin()) << '\n';
    }
    return 0;
}

题意:把很多行的单词排整齐。本来每一行中的各个单词之间含有随机个空格或tab,现在要求每一列单词左对齐。很好懂。


分析:思路很简单:找出每一列单词的最大字母数,再根据此输出即可。紫书也说了,这章不难,主要练习一下STL。之前我抱着C++ Primer也啃了很久,那这章就把之前学到的不管是不是很偏的东西尽量都用上吧。
读取文件不仅用了<sstream>,而且用了头文件iterator,用了流迭代器。其实流迭代器这里并没有什么优势,直接用流读入就行。我只是练习一下。(因为对流还能有迭代器感觉很神奇)
对于头文件<algorithm>,用到了max函数。其实在这里的情况下并没有很划算。就是 a=max(a,b);的情况。直接if (a < b) a = b;更好,这样还省掉一些赋值。
输出直接用了头文件<iomanip>里的setw对齐,left左对齐,方便的很!

推荐阅读