题目描述
有一批箱子(形式为字符串,设为str),
要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。
例如:箱子ABCDEFG,空地宽度为3,摆放结果如图:
则输出结果为:AFG
BE
CD
输入描述
输入一行字符串,通过空格分隔,前面部分为字母或数字组成的字符串str,表示箱子;
后面部分为数字n,表示空地的宽度。例如:ABCDEFG 3
输出描述
箱子摆放结果,如题目示例所示
AFG
BE
CD
备注
- 请不要在最后一行输出额外的空行
- str只包含字母和数字,1 <= len(str) <= 1000
- 1 <= n <= 1000
用例
输入 | ABCDEFG 3 |
输出 | AFG BE CD |
说明 |
解题思路分析
我们需要将字符串中的字符按照从上到下、从左到右的顺序排列在宽度为n
的网格中,并输出每行的字符。具体步骤如下:
- 读取输入:输入的字符串和宽度
n
。 - 构建网格:根据字符串长度和宽度
n
,构建一个二维网格。 - 填充网格:将字符串中的字符按顺序填入网格中。
- 输出网格:逐行输出网格中的字符。
C++程序实现
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
string input;
getline(cin, input);
size_t space_pos = input.find_last_of(" ");
string str = input.substr(0, space_pos);
int n = stoi(input.substr(space_pos + 1));
int len = str.size();
int rows = (len + n - 1) / n;
vector<vector<char>> grid(rows, vector<char>(n, ' '));
for (int i = 0; i < len; ++i) {
grid[i % rows][i / rows] = str[i];
}
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] != ' ') {
cout << grid[i][j];
}
}
cout << endl;
}
return 0;
}
Python程序实现
def main():
input_str = input().strip()
str_part, n = input_str.rsplit(' ', 1)
n = int(n)
length = len(str_part)
rows = (length + n - 1) // n
grid = [[' ' for _ in range(n)] for _ in range(rows)]
for i in range(length):
grid[i % rows][i // rows] = str_part[i]
for row in grid:
print(''.join([ch for ch in row if ch != ' ']))
if __name__ == "__main__":
main()
解释
-
读取输入:
- C++使用
getline(cin, input)
读取整行输入,并使用find_last_of
和substr
来拆分字符串和宽度。 - Python使用
input().strip()
读取输入并使用rsplit
拆分。
- C++使用
-
构建网格:
- 根据字符串长度
len
和宽度n
计算行数rows
。 - C++使用
vector<vector<char>>
构建二维数组,Python使用列表生成式构建二维列表。
- 根据字符串长度
-
填充网格:
- 依次将字符串中的字符填入网格中。
- 通过
i % rows
和i // rows
计算字符在网格中的位置。
-
输出网格:
- 按行输出网格中的字符,忽略填充的空格。
- C++使用嵌套循环和
cout
输出,Python使用列表生成式和print
输出。