21行代码AC——习题5-1 代码对齐(Alignment of Code, UVa1593)——解题报告
生活随笔
收集整理的這篇文章主要介紹了
21行代码AC——习题5-1 代码对齐(Alignment of Code, UVa1593)——解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
輸入若干行代碼,要求各列單詞的左邊界對齊且盡量靠左,單詞之間至少要空一格,每個單詞不超過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、鞏固了在線處理算法,應用更加熟練。
日拱一卒,功不唐捐。
總結
以上是生活随笔為你收集整理的21行代码AC——习题5-1 代码对齐(Alignment of Code, UVa1593)——解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解题报告——例题5-8 Unix is
- 下一篇: 21行代码AC——例题5-2 Ducci