1 条题解
-
0
【例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