题目链接:https://www.luogu.com.cn/problem/P4327
解题思路:
简单模拟。
首先,设字符串长度为 \(n\),则输出的图形是一个 \(5 \times (4 \cdot n + 1)\) 的图形。
英文字符都在第 \(3\) 行,列对应的数字均为 \(mod 4 = 3\) 的那些列,每三个字符有特殊的,特殊的列号都是 \(mod 12 = 11\) 的那些列。
其中 #
或者 *
和字符的汉密尔顿距离都是 \(2\)。
因为 #
和 *
可能有重叠的,所以先涂 #
再涂 *
。
基于这个规律,我们可以编写代码如下:
#include <bits/stdc++.h>
using namespace std;
char s[22], ans[6][110];
int n;
int dir[8][2] = {
-2, 0,
-1, -1, -1, 1,
0, -2, 0, 2,
1, -1, 1, 1,
2, 0
};
int main() {
scanf("%s", s+1);
n = strlen(s+1);
memset(ans, '.', sizeof(ans));
for (int i = 1; i <= n; i ++) {
int p = i * 4 - 1;
ans[3][p] = s[i];
if (i % 3 == 0) continue;
for (int j = 0; j < 8; j ++) {
int x = 3 + dir[j][0], y = p + dir[j][1];
ans[x][y] = '#';
}
}
for (int i = 3; i <= n; i += 3) {
int p = i * 4 - 1;
ans[3][p] = s[i];
for (int j = 0; j < 8; j ++) {
int x = 3 + dir[j][0], y = p + dir[j][1];
ans[x][y] = '*';
}
}
for (int i = 1; i <= 5; i ++) {
for (int j = 1; j <= 4*n+1; j ++)
putchar(ans[i][j]);
putchar('\n');
}
return 0;
}