解题方法是根据字符串索引的规律直接输出答案

先来看输入行数为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;
    }
}