牛客小白月賽21 NC201605 Bits

2022-05-06 23:42:09 字數 2473 閱讀 9488

nancy喜歡做遊戲!

漢諾塔是乙個神奇的遊戲,神奇在**呢?

給出3根柱子,最開始時n個盤子按照大小被置於最左的柱子。

如果盤子數為偶數,則需要將她們全部移動到最右側的柱子上,否則將她們移動到中間的柱子上。

那麼,nancy該怎樣移動呢?請你輸出漢諾塔遊戲的過程叭!

輸入描述:

共一行:乙個整數n

輸出描述:

共2^n組:每組n+2行,每行3×(2n+1)+4個字元,用.表示空白區域,用|表示柱子區域,用*表示盤子。組與組之間請輸出3×(2n+1)+4個-。

具體輸出方式請參看樣例進行理解。

輸入:2

輸出:

...................

...|.....|.....|...

..***....|.....|...

.*****...|.....|...

-------------------

...................

...|.....|.....|...

...|.....|.....|...

.*****..***....|...

-------------------

...................

...|.....|.....|...

...|.....|.....|...

...|....***..*****.

-------------------

...................

...|.....|.....|...

...|.....|....***..

...|.....|...*****.

一不小心拿了個執行時間最快qwq(8ms)(截至2020-01-28)

所以根據這種二進位制與漢諾塔的相似性,我們完全可以通過列舉二進位制來模擬漢諾塔的移動,如有n個盤,那我們就要從1列舉到2n-1(即n位二進位制1,其實n盤漢諾塔的最少移動次數f[n]就等於2n-1),對於每個數,我們看它最後乙個1在第幾位,如在第num位,也就是該移動第num

個盤了,就把編號為n的盤向右移動到下乙個可行的柱子(柱子3的下乙個柱子是柱子1)上。

你想操作二進位制第n位的1,必須等第n位後沒有1,也就是要把後面的1消除,這與漢諾塔的最優解規律是一致的:如果你想移動第n個盤,必須等這個盤子上沒有其他盤,也就是移去上面的盤,所以這種移動的二進位制規律肯定是最優解。

掌握了這個思路,接下來就是耐心考慮怎麼輸出圖案了qwq

#include#include#includeusing namespace std;

int t[3][12],count[3],n,m,width;

//t[i][j]儲存第i號柱的第j層的盤的編號(柱從0開始編號),count是柱上的盤子數,width=2*n+1,即最**的寬度

int order[6]= ,number[11];

//order是塔的順序,由於要向右移動到下乙個可行的柱子上,柱子編號超過2要回到編號0,number[i]是編號為i的盤所在的柱子

string _begin,_str,str;

//_begin是每**形的開頭部分,_str是「...|.....|.....|...」,str用於輸出每行的實際情況

inline void print()

}cout<>n,m=6*n+7;//m是行的長度

for (int i=1; i<=n; i++) t[0][i]=n-i+1;

count[0]=n;//把n個盤放在第0個柱上

for (int i=0; inum || !count[k])

}print();

}}

此外還有個小細節,就是用這種二進位制規律做出來的結果正好符合題目要求:「如果盤子數為偶數,則需要將它們全部移動到最右側的柱子上,否則將它們移動到中間的柱子上。」可是如果題目要求變換一下(比如把「偶數」換成「奇數」),對於遞迴做法很好改,但這個做法是不是還行呢?

然而,強大的二進位制規律告訴我們:照樣可以,只要把第50行換為「for (int j=2,k; j>0; j--)」,即從左開始找即可。

由於菜雞我沒怎麼寫過漢諾塔遞迴,想試試大家喜聞樂見的遞迴寫法qwq

一不小心又拿了個執行時間最快qwq(8ms)(截至2020-01-28)(逃

只要稍微改動一下即可,關於字串輸出和print()的注釋請參照方法一

#include#includeusing namespace std;

int t[3][12],count[3],n,m,width;

string _begin,_str,str;

inline void print()

}cout<>n,m=6*n+7;

for (int i=1; i<=n; i++) t[0][i]=n-i+1;

count[0]=n;

for (int i=0; i如果各位大佬有更好的理解或想法,歡迎提出改進和建議qwq!

牛客小白月賽21

牛客小白月賽21 輸出圖形,有點複雜 題意 給乙個n個點m條邊得帶權有向無環圖 拓撲圖 邊權為耗時 1號點可以任意時刻傳送任意數量資料報,n號點接受到資料報之後,會遮蔽這一時刻後的所有資料報。不同的資料報路徑不能相同,問n號點最多接受到多少個資料報 思路 因為接收到乙個資料報之後後面的就接收不到了,...

牛客小白月賽3

a 我們規定母音字母有a e i o u,並且規定半母音字母y也是母音字母。cwbc在學習英語,xhrlyb為了讓cwbc的記憶更加深刻,於是她讓cwbc把每個字串的所有字母都變成乙個恰好不大於它本身的小寫母音字母。可是cwbc比較貪玩,並且他想讓你幫他完成這個任務。聰明的你在仔細閱讀題目後,一定可...

牛客小白月賽6

c 挑花 dfs或bfs 桃花一簇開無主,可愛深紅映淺紅。題百葉桃花 桃花長在桃樹上,樹的每個節點有乙個桃花,調皮的htbest想摘盡可能多的桃花。htbest有乙個魔法棒,摘到樹上任意一條鏈上的所有桃花,由於htbest法力有限,只能使用一次魔法棒,請求出htbest最多可以摘到多少個桃花。第一行...