【洛谷习题】南蛮图腾

题目链接:https://www.luogu.org/problemnew/show/P1498


不好实现。。。

这道题在洛谷的分类是分治,我用的方法就是分治,不过却刷新的我对分治的认识。以前见过的分治都是用类似动态规划中的填表法,针对当前状态,用之前的状态推出;而这里的做法却类似于刷表法,针对当前状态,去推之后的状态。

当大小为1时,答案是确定的,当大小大于1时,我们可以由1时的答案推出:将已有答案向下复制一下,再向右复制一下。开一个二维数组来保存,中间的空格就可以被数组中的空字符代替,只需要控制行首的空格就可以了。

补充一点,这种图形叫做谢尔宾斯基三角形。

 1 #include <cstdio>
 2 
 3 const int maxl = 1050;
 4 
 5 char mt[maxl][2 * maxl];
 6 
 7 int main() {
 8     mt[1][1] = '/';
 9     mt[1][2] = '\';
10     mt[2][1] = '/';
11     mt[2][2] = '_';
12     mt[2][3] = '_';
13     mt[2][4] = '\';
14     int n;
15     scanf("%d", &n);
16     for (int i = 1; i <= n; ++i) {
17         int h = 1 << i;
18         for (int j = 1; j <= h; ++j)
19             for (int k = 1; k <= 2 * h; ++k)
20                 mt[h + j][k] = mt[h + j][2 * h + k] = mt[j][k];
21     }
22     for (int i = 1; i <= (1 << n); ++i) {
23         for (int j = (1 << n) - i; j >= 1; --j) putchar(' ');
24         for (int j = 1; j <= (1 << (n + 1)); ++j)
25             putchar(mt[i][j] ? mt[i][j] : ' ');
26         putchar('
');
27     }
28     return 0;
29 }
AC代码
原文地址:https://www.cnblogs.com/Mr94Kevin/p/9762972.html