Problem 1115 : Multi-column List

問題概要

与えられた複数の文字列を、指定された行数、カラム数、幅、スペースの
マルチカラムの形式に出力せよ。


カラムの幅に入らない文字列は次の行に繰り越され、
ページに入りきらない文字列は次のページに繰り越される。

解法

定義にしたがって実装する。
ここでは出力をvector<vector<string>>にまとめた。
カラムの幅を超える場合、余った部分を引数にもう一度関数を呼び出している。


入力が空の場合があることに注意する必要がある。

ソースコード

int pl,cn,w,sp;
int W,page,line,col;
vector<vector<string> > ans;

void out(string s)
{
	if(col==0&&line==0)
	ans.pb(vector<string>(pl,string(W,'.')));
			
	int x=(w+sp)*col,l=s.size();
	rep(i,min(l,w))ans[page][line][x+i]=s[i];
	if(++line==pl)
	{
		line=0;
		if(++col==cn)col=0,page++;
	}
	if(l>w)out(s.substr(w));
}
int main()
{
	while(cin>>pl,pl)
	{
		cin>>cn>>w>>sp; cin.ignore();
		
		W=cn*w+sp*(cn-1); page=line=col=0;
		ans.clear();
		
		string str;
		while(getline(cin,str),str!="?")out(str);
		rep(i,ans.size())
		{
			rep(j,pl)cout<<ans[i][j]<<endl;
			cout<<"#"<<endl;
		}
		cout<<"?"<<endl;
	}
	return 0;
}