题意:
输入若干行代码,要求各列单词的左边界对齐且尽量靠左,单词之间至少要空一格,每个单词不超过80个字符,每行不超过180个字符,一共最多1000行。
思路:
1、输入内容存入二维数组
2、找出每列最长的单词做域宽。
3、按域宽输出单词。
注意点:
这道题本质就是在考get型函数处理输入+按域宽和左对齐输出。
1、读取输入内容有两种方法:getline()
逐行读取后用stringstream
分割,或getchar()
逐个读取后靠判断是否为空格分割。个人更倾向第一种。
2、在读取的同时就要求出每列最长单词的大小,方便且高效。这种方法叫做在线处理。
3、每行末尾无空格,在输出时判断一下就OK。
4、求域宽和左对齐采用的是#include<iomanop>
头文件中的setw()
函数和setiosflags()
函数。
题目(提交)链接→UVa-1593
代码:
#include<bits/stdc++.h>
using namespace std;
string s, st;
vector<string> lines[1010]; //每一行的单词
int row = 0, maxcol[1010] = {0}; //行号、每列单词最长值
int main() {
while(getline(cin, s)) { //整行输入
stringstream input(s);
while(input >> st) {
maxcol[lines[row].size()] = max(maxcol[lines[row].size()],(int)st.size());
lines[row].push_back(st);//保存单词
}
row++; //行号
}
for(int i = 0; i < row; i++) {
for(int j = 0; j < lines[i].size(); j++) //j是否为最后一列,是则直接输出,否则填充空格左对齐。
j==(lines[i].size()-1) ? cout << lines[i][j] : cout << setw(maxcol[j]+1) << setiosflags(ios::left) << lines[i][j];
cout << "\n";
}
return 0;
}
收获:
1、巩固了getline()用法
2、巩固了在线处理算法,应用更加熟练。