UVA1593(Alignment of Code)(STL模板

2018-06-06  本文已影响0人  myleosu

UVA1593传送门
我快被这道题给气死了。。简直垃圾。。我的输出文件尾最后少了一行被判题姬判为WA,而不是PE,搞得我傻傻的debug了近一个半钟,还去网上看了别人代码没觉得有什么问题,结果错误居然是一个换行符,但没有显示PE!!!
思路:思路比较简单,利用STL模板即可,记录每一列的最长长度然后较短的字符串右侧补空格,最后一列不用。记住:文件尾有换行符!!!
一开始的AC代码(暴力模拟,给每个字符串补齐空格)(代码略长):

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>

using namespace std;
vector<string> str_table[1010];
int max_size[200];

void str_charge(string&str,int len){
    for(int i = str.length();i<len;i++)
        str+=" ";
}

int main()
{
    //freopen("text.txt","r",stdin);
    memset(max_size,0,sizeof(max_size));
    string s;
    int r = 0,max_cowls = 0;
    while(getline(cin,s)){
        for(int i = 0;i<s.length();i++){
            if(s[i]!=' '){
                int j = i;
                string x;
                while(s[j]!=EOF&&s[j]!=' '&&j!=s.length())
                    x+=s[j++];
                i = j-1;
                str_table[r].push_back(x);
            }
        }
        max_cowls = max_cowls>str_table[r].size()?max_cowls:str_table[r].size();
        r++;
    }
    for(int i = 0;i<max_cowls;i++){
        for(int j = 0;j<r;j++){
            if(i>=str_table[j].size()) continue;
            max_size[i] = max_size[i]>str_table[j][i].length()?max_size[i]:str_table[j][i].length();
        }
    }
    for(int i = 0;i<max_cowls;i++){
        for(int j = 0;j<r;j++){
            if(i+1>=str_table[j].size()) continue;
            str_charge(str_table[j][i],max_size[i]);
        }
    }
    for(int i = 0;i<r;i++){
        for(int j = 0;j<str_table[i].size();j++){
            cout<<str_table[i][j];
            if(j!=str_table[i].size()-1)
                cout<<" ";
        }
        cout<<endl;//这个不用判断是否为最后一行!!!
    }
    return 0;
}

用sstream处理优化后的AC代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <iomanip>
#include <sstream>

using namespace std;
vector<string> str_table[1010];
int max_size[200];

int main()
{
    string s,t;
    int r = 0,c;
    while(getline(cin,s)){
        stringstream ss(s);
        c = 0;
        while(ss>>t){
            max_size[c] = max((int)t.size(),max_size[c]);
            str_table[r].push_back(t);
            c++;
        }
        r++;
    }
    for(int i = 0;i<r;i++){
        int j = 0;
        for(;j<(int)str_table[i].size()-1;j++){
            cout<<left<<setw(max_size[j]+1)<<str_table[i][j];
        }
        cout<<str_table[i][j]<<endl;
    }
    return 0;
}

大写的服气。。没想到被杭电oj坑过最后一行多一换行符后又被UVA坑了最后一行少一换行符。真是被坑到怀疑人生系列

上一篇下一篇

猜你喜欢

热点阅读