解题方法是根据字符串索引的规律直接输出答案
先来看输入行数为4的情况
| A |
|
|
|
|
|
A |
|
|
|
|
|
A |
|
|
|
|
A |
|
|
|
A |
|
A |
|
|
|
A |
|
|
|
|
|
|
A |
|
A |
|
|
|
A |
|
A |
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
A |
|
|
|
|
|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|
第一行:差为6
第二行:差为4或2
第三行:差为2或4
第四行:差为6
虽然第二行,第三行出现变化值,但是差的和是统一的6。
如果你观察输入行数为5的情况,可以发现每一行差的和是统一的8。
得到以下 输入行数,每一行字符串相邻两个字符索引差的和 的关系
1 -> 1
2 -> 2
3 -> 4
4 -> 6
5 -> 8
6 -> 10
很明显这是一个从2开始的等差数列
我们实现这个函数,记作 f
int f(int a)
{
if (a == 1)
{
return 1;
}
else
{
return (a - 1) * 2;
}
}
尝试直接根据索引输出行数为4的答案:
cout << str[0]; cout << str[0 + f(4)]; cout << str[0 + f(4) + f(4)]; ...... cout << str[1]; cout << str[1 + f(3)]; cout << str[1 + f(3) + (f(4) - f(3))]; cout << str[1 + f(3) + (f(4) - f(3)) + f(3)]; ...... cout << str[2]; cout << str[2 + f(2)]; cout << str[2 + f(2) + (f(4) - f(2))]; cout << str[2 + f(2) + (f(4) - f(2)) + f(2)]; ...... cout << str[3]; cout << str[3 + f(4)]; ......这是有明显规律的,我们直接使用循环实现。
题解如下
#include <bits/stdc++.h>
using namespace std;
int f(int a)
{
if (a == 1)
{
return 1;
}
else
{
return (a - 1) * 2;
}
}
int main()
{
int T;
cin >> T;
for (int o = 0; o < T; o++)
{
int a;
cin >> a;
string str;
cin >> str;
int l = f(a);
for (int i = 0; i < a; i++)
{
int index = i; // index记录当前索引,起始值是i
// 第一行或最后一行
if (i == 0 || i == a - 1)
{
while (index < str.length()) // 确保不越界
{
cout << str[index];
index += l; // 计算下一个索引
}
}
// 其他行
else
{
int count = 1; // 用于判断加f(a - i)还是加f(a) - f(a - i)
int g = f(a - i);
while (index < str.length()) // 确保不越界
{
cout << str[index];
if (count % 2 == 0)
{
index += l - g; // 计算下一个索引
}
else
{
index += g; // 计算下一个索引
}
count++;
}
}
}
cout << endl;
}
}

京公网安备 11010502036488号