题目链接:L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn)
目录:
目录:
题目要求:
输入格式:
输出格式:
输入样例:
输出样例:
思路:
代码:
测试结果:
编辑
题目要求:
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
思路:
让我们逐步分析代码:
头文件、命名空间:这包括了几乎所有的标准库,并使用了 std 命名空间
#include <bits/stdc++.h>
using namespace std;
主函数:这是程序的入口点。
int main()
{
....
}
变量声明:n表示要将字符串分成的列数,
str用于存储输入的字符串,
arr`是一个二维字符数组,用于存储重新排列后的字符。
int n;
string str;
char arr[1001][1001];
* `n`:列数。
* `str`:输入的字符串。
* `arr`:一个二维字符数组,用于存储转置后的字符串。
读取输入:首先输入列数n
,然后使用getchar()
来消耗输入流中的换行符(这是为了避免它影响后面的getline
函数)。接着使用getline
函数读取整行的字符串。
cin >> n;
getchar();
getline(cin,str);
* `cin >> n;`:读取列数 `n`。
* `getchar();`:读取并丢弃一个字符,通常用于跳过输入中的换行符,确保 `getline` 能正确读取后面的字符串。
* `getline(cin,str);`:读取一行字符串到 `str`。
计算每列的长度:这里计算了行数l
。首先,通过字符串长度除以列数得到基本的行数。然后,如果字符串长度不能被列数整除,说明还有剩余的字符,所以行数需要加1。
int l = str.size() / n;
if(str.size() % n != 0)
l ++;
l = str.size() / n;
:计算每行的基础字符数。if(str.size() % n != 0) l ++;
:如果字符串长度不能被n
整除,则增加一行来容纳额外的字符。
列转换:这部分代码负责将字符重新排列到二维数组arr
中。外层循环从下往上遍历每一行,内层循环从左往右遍历每一列。如果str[k]
是字符串的结束符(即\0
),则在arr
中对应的位置放置空格;否则,将str[k]
放到arr
中,并增加k
的值。
int k = 0;
for(int i = l - 1; i >= 0; i--)
{
for(int j = 0; j < n; j++)
{
if(str[k] == '\0')
arr[j][i] = ' ';
else
{
arr[j][i] = str[k];
k++;
}
}
}
- 外层循环从
l-1
到0
,表示从最后一行开始填充。- 内层循环从
0
到n-1
,表示填充每一行的字符。- 如果当前字符是字符串末尾的结束符
'\0'
,则在二维数组arr
中对应位置放置空格' '
。- 否则,将当前字符放入
arr
的对应位置,并递增k
来指向字符串中的下一个字符。
输出转置后的字符串:这部分代码负责输出重新排列后的字符。外层循环遍历每一列,内层循环遍历每一行,然后输出对应位置的字符。每输出完一列后输出一个换行符。
for(int i = 0; i < n; i++)
{
for (int j = 0; j < l; j++)
{
cout << arr[i][j];
}
cout << endl;
}
- 外层循环遍历每一行。
- 内层循环遍历每一行的每一个字符,并输出。
结束程序:程序正常结束。
return 0;
注意:
- 代码中
arr
的大小被固定为1001x1001
,这意味着如果输入的字符串非常大或者列数非常大,可能会导致数组越界。在实际应用中,应该根据输入动态地分配数组大小,或者使用std::vector
等动态数据结构。- 在将字符从
str
复制到arr
的过程中,如果str
中的字符已经用完(即str[k]
是字符串结束符\0
),则将arr
中的对应位置设置为空格字符' '
。- 最后,代码会按照行和列的顺序打印出重新排列后的字符串。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string str;
char arr[1001][1001];
cin >> n;
getchar();
getline(cin,str);
int l = str.size() / n;
if(str.size() % n != 0)
l ++;
int k = 0;
for(int i = l - 1; i >= 0; i--)
{
for(int j = 0; j < n; j++)
{
if(str[k] == '\0')
arr[j][i] = ' ';
else
{
arr[j][i] = str[k];
k++;
}
}
}
for(int i = 0; i < n; i++)
{
for (int j = 0; j < l; j++)
{
cout << arr[i][j];
}
cout << endl;
}
return 0;
}