7-6 古风排版 (20分)
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
AC
我使用的是最简单的数组了,但是找规律也写了好久
这里看到了别人使用STL的方法,我也没用过,但是存储方式很简单的。
CCCC-GPLT L1-039. 古风排版 团体程序设计天梯赛
#include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main() {
int n;
string s;
cin>>n;//n行
getchar();
getline(cin,s);
int len=s.length();
int col;//列 要考虑整除的情况 不整除的时候+1
if(len%n==0) col=len/n;
else col=len/n+1;
//先进行初始化全部为 空格
char a[n][col+1];
for(int i=0; i<n; i++)
for(int j=0; j<=col; j++)
a[i][j]=' ';
int b[n];//记录 每一行已经存入了几个元素 最大为col
for(int i=0; i<n; i++)
b[i]=col;
int cnt=col;
for(int i=0; i<len; i++) {
int x=i%n;
a[x][b[x]--]=s[i];
}
for(int i=0; i<n; i++) {
for(int j=1; j<=col; j++)
cout<<a[i][j];
cout<<endl;
}
return 0;
}
stack堆栈方法
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
string a;
getchar();
getline(cin,a);
int len=a.length();
stack<char> s[n];
int p=0;
for(int i=0; i<len; i++) {
if(p==n) p=0;
s[p++].push(a[i]);
}
int t=s[0].size();
for(int i=0; i<n; i++) {
int l=s[i].size();
if(l<t) {
cout<<' ';
}
while(!s[i].empty()){
cout<<s[i].top();
s[i].pop();
}
cout<<endl;
}
return 0;
}
最简单的
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,cur=0;
string s,res="";
cin>>n;
getchar();
getline(cin,s);
int len=s.length();
while(1) {
for(int i=cur; i<len; i+=n)
res=s[i]+res;
if(len%n)
while(res.length()!=len/n+1)
res=" "+res;
if(cur!=n-1) cout<<res<<endl;
else cout<<res;
res="";
if(cur<n-1) cur+=1;
else break;
}
return 0;
}