#P2998. 箱子之字形摆放(100分)
-
1000ms
Tried: 363
Accepted: 99
Difficulty: 3
所属公司 :
华为od
箱子之字形摆放(100分)
题面描述
有一批箱子(形式为字符串,设为 str),要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地。最终需要输出每一行的摆放结果。
思路
-
分组处理: 将字符串
str按每n个字符一组进行分割。如果最后一组不足n个字符,则按实际长度处理。 -
方向交替:
- 第一组(组编号为0)按从上到下的顺序排列。
- 第二组(组编号为1)按从下到上的顺序排列。
- 第三组(组编号为2)按从上到下的顺序排列。
- 以此类推,组内排列方向交替。
-
行收集: 根据当前组的排列方向,将字符依次添加到对应的行中:
- 如果当前组为从上到下,则字符依次添加到第1行、第2行、...、第n行。
- 如果当前组为从下到上,则字符依次添加到第n行、第(n-1)行、...、第1行。
-
输出结果: 遍历所有行,按顺序输出每一行的字符,注意最后一行后不输出额外的换行符。
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
int n;
// 读取输入字符串和整数n
cin >> str >> n;
// 初始化n个空字符串,分别对应每一行
vector<string> rows(n, "");
int group = 0; // 当前组编号
int len = str.size();
int i = 0; // 当前字符索引
while(i < len){
// 计算当前组的实际长度
int group_size = min(n, (int)(len - i));
// 提取当前组的子字符串
string current_group = str.substr(i, group_size);
if(group % 2 == 0){
// 偶数组:从上到下排列
for(int j=0; j<group_size; ++j){
rows[j] += current_group[j];
}
}
else{
// 奇数组:从下到上排列
for(int j=0; j<group_size; ++j){
rows[n-1-j] += current_group[j];
}
}
// 更新索引和组编号
i += group_size;
group++;
}
// 输出每一行的结果,注意不要在最后一行输出额外的换行
for(int k=0; k<n; ++k){
cout << rows[k];
if(k != n-1){
cout << "\n";
}
}
return 0;
}
python
# 读取输入并分割为字符串和整数n
input_line = input().strip().split()
str_input = input_line[0]
n = int(input_line[1])
# 初始化n个空字符串,分别对应每一行
rows = ['' for _ in range(n)]
group = 0 # 当前组编号
i = 0 # 当前字符索引
length = len(str_input)
while i < length:
# 计算当前组的实际长度
group_size = min(n, length - i)
# 提取当前组的子字符串
current_group = str_input[i:i+group_size]
if group % 2 == 0:
# 偶数组:从上到下排列
for j in range(group_size):
rows[j] += current_group[j]
else:
# 奇数组:从下到上排列
for j in range(group_size):
rows[n-1-j] += current_group[j]
# 更新索引和组编号
i += group_size
group += 1
# 输出每一行的结果,最后一行后不加额外的换行
for k in range(n):
if k != n-1:
print(rows[k])
else:
print(rows[k], end='')
java
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 读取输入字符串和整数n
String str = sc.next();
int n = sc.nextInt();
// 初始化n个StringBuilder,分别对应每一行
StringBuilder[] rows = new StringBuilder[n];
for(int i=0;i<n;i++) rows[i] = new StringBuilder();
int group = 0; // 当前组编号
int len = str.length();
int i = 0; // 当前字符索引
while(i < len){
// 计算当前组的实际长度
int group_size = Math.min(n, len - i);
// 提取当前组的子字符串
String current_group = str.substring(i, i + group_size);
if(group % 2 == 0){
// 偶数组:从上到下排列
for(int j=0; j<group_size; j++){
rows[j].append(current_group.charAt(j));
}
}
else{
// 奇数组:从下到上排列
for(int j=0; j<group_size; j++){
rows[n-1-j].append(current_group.charAt(j));
}
}
// 更新索引和组编号
i += group_size;
group++;
}
// 输出每一行的结果,最后一行后不加额外的换行
for(int k=0; k<n; k++){
if(k != n-1){
System.out.println(rows[k].toString());
}
else{
System.out.print(rows[k].toString());
}
}
}
}
题目内容
有一批箱子(形式为字符串,设为 str ), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。
例如:箱子 ABCDEFG ,空地宽度为 3 ,摆放结果如图:

则输出结果为:
AFG
BE
CD
输入描述
输入一行字符串,通过空格分隔,前面部分为字母或数字组成的字符串 str ,表示箱子; 后面部分为数字 n ,表示空地的宽度。例如: ABCDEFG 3
输出描述
箱子摆放结果,如题目示例所示
AFG
BE
CD
备注
1.请不要在最后一行输出额外的空行
2.str 只包含字母和数字,1<=len(str)<=1000
3.1<=n<=1000
样例1
输入
ABCDEFG 3
输出
AFG
BE
CD