文章目录
L1-039 古风排版
题目描述
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
代码
#include<bits/stdc++.h> // 包含STL库,此写法通常只用于竞赛编程
using namespace std;
int main() {
int n; // 定义n,每列的字符数
cin >> n; // 从标准输入读取每列的字符数
cin.ignore(); // 忽略输入中的换行符
string a; // 定义字符串a,用于存储输入的文本
string b[100]; // 定义字符串数组b,用于存储每列的文本
getline(cin, a); // 从标准输入读取整行文本
int i, j; // 定义循环变量i, j
int flag = 0; // 定义补空白字符的标志
for (i = 0; ; i++) { // 无限循环,计算需要多少列
if (n * i >= a.size()) { // 如果列数乘以每列字符数大于等于文本长度
flag = n * i - a.size(); // 计算最后一列需要补多少空格
break; // 跳出循环
}
}
for (i = 0; i < a.size(); i++) { // 遍历文本中的每个字符
int t = i % n; // 计算当前字符应放在哪一列
b[t] += a[i]; // 将字符添加到对应的列
if (i == a.size() - 1) { // 如果是文本的最后一个字符
if (flag > 0) { // 如果需要补空格
while (flag != 0) { // 补足空格
b[n - flag] += ' '; // 在对应的列添加空格
flag--; // 空格补足标志减一
}
}
}
}
for (i = 0; i < n; i++) { // 遍历每一列
reverse(b[i].begin(), b[i].end()); // 将每列的字符串反转,因为古文是从下到上的
cout << b[i] << endl; // 输出每一列的字符串
}
return 0; // 程序结束
}
这段代码的主要逻辑是:
- 读取每列的字符数 n 和待排版的字符串 a。
- 通过一个无限循环,计算出总共需要多少列,并确定最后一列是否需要补空格。
- 遍历字符串 a 中的每个字符,将每个字符放入其应位于的列 b[t]。
- 如果是最后一个字符,并且需要补空格,则在对应的列补充空白字符。
- 最后,对每一列的字符串进行反转,因为古风排版是从下到上的,然后将每一列按顺序输出。