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坑了最后一行少一换行符。真是被坑到怀疑人生系列
网友评论