题目链接: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 }