# String Manipulation# Array# Input Processing

a622 - 2. Vertical Printing

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一系列隊名,直到讀取到 "END" 為止,然後將這些隊名垂直輸出。隊名長度不足 16 時,需用空格補齊。輸出時,每個字元之間應有兩個空格。

解題思路

程式使用一個二維字元陣列 ans 來儲存隊名。讀取每個隊名後,先檢查其長度是否超過目前的最大長度,若超過則更新最大長度。然後,將隊名補齊到 16 個字元,再將隊名中的每個字元存入 ans 陣列的對應位置。最後,按照行優先的順序輸出 ans 陣列中的字元,如果字元為預設值 '?',則跳過不輸出。

複雜度分析

  • 時間複雜度: O(N * M),其中 N 是隊名的數量,M 是隊名的最大長度 (在本題中為 16)。
  • 空間複雜度: O(M * M),其中 M 是隊名的最大長度 (在本題中為 50)。

程式碼

#include <iostream>
#include <string>
using namespace std;
char ans[50][50];
int main(){
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			ans[i][j]='?';		
		}
	}
	int x=0,max=0;
	string a;
	while(getline(cin,a)){
		if(a.length()>max){
			max=a.length();
		}
		if(a=="END")break;
		while(a.length()<16){
			a+=' ';
		}
		int al=a.length();
		for(int i=0;i<al;i++){
			ans[i][x]=a[i];
		}
		x++;
	}
	for(int j=0;j<max;j++){
		for(int i=0;i<50;i++){
			if(ans[j][i]!='?'){
				cout << ans[j][i] << "  ";
			}
		}
		cout << "\n";
	}
}

Discussion