洛谷 P5483 小A的烦恼 题解

题目传送门

STEP 1:简化题意

题目简单来说就是输入几个表格,然后把它们按先后顺序排成一排,合成一个大表格,进行输出。

STEP 2:思路推导

题目是一个接一个表格输入,把每个位置的数据当做字符串,用一个 string 类型的数组把它们保存下来。

STEP 3:分析难点

本题难点主要在处理数据上,比较叫人头大的点在于它的输入是用逗号隔开的。

因此我们必须集体输入一行,再进行提取

STEP 4:避开坑点

  1. 每行输出最后不加逗号。
  2. 输入的每个表格还有个题目,也得当做数据处理。
  3. 表格里的每个元素并不是只有一个字符,得用 string 来存储其中每个位置的数据(具体操作见代码)。

AC 代码:

注释比较多,希望你能认真看。

#include
using namespace std;
string ans[110][10001], tmp;
// tmp 是临时字符串。
int n, m, now = 1, maxn = -100;
// now 是记录目前已经存到第几列了,也是 ans 数组宽度(见输出)。
// maxn 是最大的行数(即输出的行数)。
inline int read() {
    char c;
    int x = 0, f = 1;
    c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
int main() {
    n = read();
    while (n--) {
        int t = -100;
        m = read();maxn = max(maxn, m);
        cin >> tmp;
        ans[0][now] = tmp;
        // 标题也得存入数组。
        for (int k = 1; k <= m; k++) {
            cin >> tmp;
            int g = 0, tot = 0;
            // g 是每个元素的起始点, tot 是每行元素的个数。
            int l = tmp.size();
            tmp += ",";// 加一个逗号,方便后面区分元素。
            for (int i = 0; i <= l; i++) {
                if (tmp[i] == ',') {
                    ans[k][tot + now] = tmp.substr(g, i - g );
                    // 从 g 开始,g ~ i - 1都属于这个元素。
                    g = i + 1;// 更新起始位置。
                    tot++;
                }
            }
            t = max(t, tot);
        }
        now += t;
    }
    for (int i = 0; i <= maxn; i++) { // 标题在第 0 行。
        for (int j = 1; j < now - 1; j++)
            cout << ans[i][j] << ',';
        cout << ans[i][now - 1] << '\n';
    }
    return 0;
}

这是一篇很正经的题解

你可能感兴趣的:(算法)