题目来源:PTA 团体程序设计天梯赛
题目编号:L1-039
作者:陈越
出题单位:浙江大学
分值:20 分


📋 题目描述

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


📥 输入格式

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


📤 输出格式

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


📌 输入样例

4
This is a test case

📌 输出样例

asa T
st ih
e tsi
 ce s

💡 解题思路

核心问题: 把一个字符串按照"从右向左、从上到下"的古风方式排成若干列,然后按行输出。

分析步骤:

  1. 理解排版规则:古风排版是"竖向从上到下,整体从右向左"。也就是说,原字符串先按每列 N 个字符分组,然后第一列放最右边,最后一列放最左边。
  2. 确定列数:总字符数为 len,每列字符数为 N,则总列数 cols = ceil(len / N)
  3. 构建二维结构:把字符串按列填入一个二维数组(或模拟),第 j 列存放字符串中第 j*Nj*N+N-1 的字符。
  4. 按行输出(从右向左):对于第 i 行(i 从 0 到 N-1),依次从第 cols-1 列到第 0 列输出对应的字符。若某列不足 N 个字符,该位置用空格补齐。
  5. 注意行末不加多余空格:每行相邻字符之间无分隔符,直接拼接输出。

关键点: 最后一列可能不满 N 个字符,需用空格补全,以保证按行输出时对齐。


💻 代码实现(Java)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();          // 每列字符数
        sc.nextLine();                  // 消耗换行
        String s = sc.nextLine();       // 输入字符串

        int len = s.length();
        // 计算总列数(向上取整)
        int cols = (len + n - 1) / n;

        // 构建二维字符数组,不足部分用空格补全
        char[][] grid = new char[n][cols];
        for (int j = 0; j < cols; j++) {
            for (int i = 0; i < n; i++) {
                int idx = j * n + i;
                if (idx < len) {
                    grid[i][j] = s.charAt(idx);
                } else {
                    grid[i][j] = ' '; // 不足部分补空格
                }
            }
        }

        // 按行输出,列从右向左
        for (int i = 0; i < n; i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = cols - 1; j >= 0; j--) {
                sb.append(grid[i][j]);
            }
            System.out.println(sb.toString());
        }
    }
}

🐍 代码实现(Python)

n = int(input())
s = input()

length = len(s)
cols = (length + n - 1) // n  # 总列数

# 构建二维结构,不足补空格
grid = []
for j in range(cols):
    col = []
    for i in range(n):
        idx = j * n + i
        if idx < length:
            col.append(s[idx])
        else:
            col.append(' ')
    grid.append(col)

# 按行输出,列从右向左
for i in range(n):
    line = ''
    for j in range(cols - 1, -1, -1):
        line += grid[j][i]
    print(line)

✅ 运行验证

输入:

4
This is a test case

手动模拟:

字符串 This is a test case(共19个字符),每列4个字符:

列号 字符(从上到下)
列0(最右) T, h, i, s
列1 ’ ', i, s, ’ ’
列2 a, ’ ', t, e
列3 s, t, ’ ', c
列4(最左) a, s, e, (空格补全)

按行从右列→左列输出(共4行):

  • 第0行:a + s + a + ’ ’ + T = asa T
  • 第1行:s + t + ’ ’ + i + h = st ih
  • 第2行:e + ’ ’ + t + s + i = e tsi
  • 第3行:(空格) + c + e + ’ ’ + s = ce s

输出:

asa T
st ih
e tsi
 ce s

✅ 与预期结果完全一致!


📊 复杂度分析

项目
时间复杂度 O(N × cols) = O(字符串长度)
空间复杂度 O(N × cols) = O(字符串长度)
字符串最大长度 1000
N 最大值 < 100

完全在题目限制范围内,无需担心超时或超内存。


📝 总结

本题的关键是正确理解"古风排版"的规则:

  • 填充方向:从左到右按列填入字符串(每列从上到下)
  • 输出方向:从最右列到最左列,按行打印
  • 补全处理:最后一列不足 N 个字符时,用空格补满,保证对齐

掌握了这个思路,代码实现并不复杂,注意边界处理即可。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐