【洛谷习题】南蛮图腾
生活随笔
收集整理的這篇文章主要介紹了
【洛谷习题】南蛮图腾
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:https://www.luogu.org/problemnew/show/P1498
?
不好實現(xiàn)。。。
這道題在洛谷的分類是分治,我用的方法就是分治,不過卻刷新的我對分治的認(rèn)識。以前見過的分治都是用類似動態(tài)規(guī)劃中的填表法,針對當(dāng)前狀態(tài),用之前的狀態(tài)推出;而這里的做法卻類似于刷表法,針對當(dāng)前狀態(tài),去推之后的狀態(tài)。
當(dāng)大小為1時,答案是確定的,當(dāng)大小大于1時,我們可以由1時的答案推出:將已有答案向下復(fù)制一下,再向右復(fù)制一下。開一個二維數(shù)組來保存,中間的空格就可以被數(shù)組中的空字符代替,只需要控制行首的空格就可以了。
補充一點,這種圖形叫做謝爾賓斯基三角形。
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('\n'); 27 } 28 return 0; 29 } AC代碼?
轉(zhuǎn)載于:https://www.cnblogs.com/Mr94Kevin/p/9762972.html
總結(jié)
以上是生活随笔為你收集整理的【洛谷习题】南蛮图腾的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组 this.setData快捷赋值
- 下一篇: bzoj4998: 星球联盟