1 条题解

  • 0
    @ 1998-2-10 9:26:37

    【例74.3】 彼得·潘框架

    解题思路

    建立5行、4L+1列点阵。每个字母中心列4i+2,框边是与中心(2,4i+2)曼哈顿距离为2的位置。每第三字母用*,其他#;*永远覆盖#,最后写字母。

    正确性说明

    依照上述推导,逐步维护已处理部分的有效状态。每一步都完成当前项的贡献且不改变已确定的次序,结束时输出的状态恰好对应题目要求。

    易错点

    相邻框共享一列;温迪框优先级更高,不按绘制先后让#覆盖*。

    复杂度

    时间O(L),空间O(L)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        string s;
        cin >> s;
        int L = s.size();
        vector<string> a(5, string(4 * L + 1, '.'));
        for (int i = 0; i < L; i++) {
            char mark = (i + 1) % 3 == 0 ? '*' : '#';
            int center = 4 * i + 2;
            for (int r = 0; r < 5; r++)
                for (int d = -2; d <= 2; d++)
                    if (abs(r - 2) + abs(d) == 2) {
                        int c = center + d;
                        if (mark == '*' || a[r][c] != '*')
                            a[r][c] = mark;
                    }
        }
        for (int i = 0; i < L; i++)
            a[2][4 * i + 2] = s[i];
        for (auto &r : a)
            cout << r << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    481
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者