【PTA】L1-039 古风排版(C++)

题目链接:L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn)

目录:

目录:

题目要求:

输入格式:

输出格式:

输入样例:

输出样例:

思路:

代码:

测试结果:

​编辑


题目要求:

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

思路:

让我们逐步分析代码:

头文件、命名空间:这包括了几乎所有的标准库,并使用了 std 命名空间

cpp 复制代码
#include <bits/stdc++.h>  
using namespace std;

主函数:这是程序的入口点。

cpp 复制代码
int main()
 
{
 
       ....
 
}

变量声明: n表示要将字符串分成的列数,str用于存储输入的字符串,arr`是一个二维字符数组,用于存储重新排列后的字符。

cpp 复制代码
int n;  
string str;  
char arr[1001][1001];

* `n`:列数。

* `str`:输入的字符串。

* `arr`:一个二维字符数组,用于存储转置后的字符串。

读取输入: 首先输入列数n,然后使用getchar()来消耗输入流中的换行符(这是为了避免它影响后面的getline函数)。接着使用getline函数读取整行的字符串。

cpp 复制代码
cin >> n;  
getchar();  
getline(cin,str);

* `cin >> n;`:读取列数 `n`。

* `getchar();`:读取并丢弃一个字符,通常用于跳过输入中的换行符,确保 `getline` 能正确读取后面的字符串。

* `getline(cin,str);`:读取一行字符串到 `str`。

计算每列的长度: 这里计算了行数l。首先,通过字符串长度除以列数得到基本的行数。然后,如果字符串长度不能被列数整除,说明还有剩余的字符,所以行数需要加1。

cpp 复制代码
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的值。

cpp 复制代码
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-10,表示从最后一行开始填充。
  • 内层循环从 0n-1,表示填充每一行的字符。
  • 如果当前字符是字符串末尾的结束符 '\0',则在二维数组 arr 中对应位置放置空格 ' '
  • 否则,将当前字符放入 arr 的对应位置,并递增 k 来指向字符串中的下一个字符。

输出转置后的字符串: 这部分代码负责输出重新排列后的字符。外层循环遍历每一列,内层循环遍历每一行,然后输出对应位置的字符。每输出完一列后输出一个换行符。

cpp 复制代码
for(int i = 0; i < n; i++)  
{  
    for (int j = 0; j < l; j++)  
    {  
        cout << arr[i][j];  
    }  
    cout << endl;  
}
  • 外层循环遍历每一行。
  • 内层循环遍历每一行的每一个字符,并输出。

**结束程序:**程序正常结束。

cpp 复制代码
return 0;

注意:

  • 代码中 arr 的大小被固定为 1001x1001,这意味着如果输入的字符串非常大或者列数非常大,可能会导致数组越界。在实际应用中,应该根据输入动态地分配数组大小,或者使用 std::vector 等动态数据结构。
  • 在将字符从 str 复制到 arr 的过程中,如果 str 中的字符已经用完(即 str[k] 是字符串结束符 \0),则将 arr 中的对应位置设置为空格字符 ' '
  • 最后,代码会按照行和列的顺序打印出重新排列后的字符串。

代码:

cpp 复制代码
#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;
}

测试结果:

相关推荐
sz66cm2 小时前
Python基础 -- 使用Python实现ssh终端并实现数据处理与统计功能
开发语言·python·ssh
小灰灰爱代码2 小时前
C++——求3*3矩阵对角元素之和。
数据结构·c++·算法
老K(郭云开)2 小时前
allWebPlugin中间件自定义alert、confirm及prompt使用
c++·chrome·中间件·prompt·html5·edge浏览器
liangbm33 小时前
MATLAB系列02:MATLAB基础
开发语言·数据结构·笔记·matlab·教程·工程基础·高级绘图
change95134 小时前
PHP纯离线搭建(php 8.1.7)
开发语言·php
福鸦4 小时前
详解c++:new和delete
开发语言·c++
qq_172805594 小时前
Go Testify学习与使用
开发语言·golang·go
兩尛5 小时前
java--面向对象编程(中级部分)
java·开发语言
createcrystal5 小时前
《算法笔记》例题解析 第3章入门模拟--3图形输出(9题)2021-03-03
c++·笔记·算法
卡戎-caryon5 小时前
【Linux】09.Linux 下的调试器——gdb/cgdb
linux·运维·服务器·开发语言·笔记