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; }