1. 程式人生 > 其它 >Alignment of Code

Alignment of Code

Problem

Link

題意:輸入若干行程式碼,要求各列單詞的左邊界對齊且儘量靠左。

一道很基礎的字串處理題目,我們可以用才學的 string 進行處理。

Solution

一整行的讀入可以採用 getline 讀入。

然後以空格為分界將每個單詞放入二維陣列中。這樣可以便於求得每列單詞的最大長度,短的單詞用空格補齊,以達到每列對齊。

Code

#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

const int Maxn = 1000;
const int Maxm = 180;

string str, word;
string a[Maxn + 5][Maxm + 5];
int len[Maxn + 5], siz[Maxm + 5];

int Max (int a, int b) {
	return a > b ? a : b;
}

int main () {
	int n = 0;
	while (getline (cin, str)) {
		n ++;
		for (int i = 0; i < (int) str.size (); i ++) {
			if (str[i] != ' ') word.push_back (str[i]);
			else {
				if ((int) word.size ()) {
					a[n][++ len[n]] = word;
//					cout << endl << n << ',' << len[n] << word << endl;
					word.clear ();
				}
			}
		}
		if ((int) word.size ()) {
			a[n][++ len[n]] = word;
			word.clear ();
		}
	}
	
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= len[i]; j ++) {
			siz[j] = Max (siz[j], (int) a[i][j].length () + 1);
		}
	}

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= len[i]; j ++) {
			cout << a[i][j];
			if (j == len[i]) continue;
			for (int k = (int) a[i][j].length () + 1; k <= siz[j]; k ++) printf (" ");
		}
		printf ("\n");
	}
	return 0;
}