這裡有n列火車將要進站再出站,但是,每列火車只有1節,那就是車頭。
這n列火車按1到n的順序從東方左轉進站,這個車站是南北方向的,它雖然無限長,只可惜是乙個死胡同,而且站台只有一條股道,火車只能倒著從西方出去,而且每列火車必須進站,先進後出。
也就是說這個火車站其實就相當於乙個棧,每次可以讓右側頭火車進棧,或者讓棧頂火車出站。
車站示意如圖:
出站<—— <——進站
|車||站|
|__|
現在請你按《字典序》輸出前20種可能的出棧方案。
輸入格式
輸入乙個整數n,代表火車數量。
輸出格式
按照《字典序》輸出前20種答案,每行一種,不要空格。
資料範圍
1≤n≤201≤n≤20
輸入樣例:
3
輸出樣例:
123
132213
231321
模擬, 搜尋
題目要求可以轉化為, 一組連續的數字, 1, 2, 3...以遞增的順序.進入棧空.列印出所有可能的出棧次序.
考慮利用深搜的思想解決這個問題.
把棧內數字考慮為狀態.任意的時候.只能有2個情況. 從棧裡面取出棧頂元素出棧, 已經放數字入棧.利用這種方法,就可以遍歷出所有可能的出棧情況.
如何以字典順序出棧呢?入棧的順序是固定, 以數字遞增入棧. 那麼如果想要出棧以字段序的話, 只要棧內有元素就考慮出棧,就可以做到以字典序出棧.
按照這個思路,我們可以建立一顆搜尋樹.
初始的時候的狀態為棧初始時候的狀態, 為空. 初始狀態可以轉化為2種狀態, 出棧的狀態, 和入棧的狀態. 因為初始棧為空,所以只能轉換為入棧的狀態.第乙個數字1入棧.
接著通過棧裡面的有數字1這個狀態, 可以到達兩個狀態, 出棧和入棧, 出棧棧為空, 入棧數字2入棧. 以此類推, 就可以建立一棵搜尋樹. 通過對這個樹的搜尋,就可以找到所有的出棧狀態.
具體:設定三個變數state1表示已經出棧的數字, state2表示棧內的數字, state3表示還未入棧的數字.
[**]
#include #include #include #include #include #include using namespace std;
stackstate2;
vectorstate1;
int state3 = 1;
int cnt, n;
void dfs()
cout << endl;
cnt++;
return ;
}if(state2.size())
if(state3 <= n)
}int main()
火車進棧 dfs
題目描述 這裡有n列火車將要進站再出站 但是,每列火車只有1節 那就是車頭 描述有n列火車按1到n的順序從東方左轉進站,這個車站是南北方向的,它雖然無限長,只可惜是乙個死胡同,而且站台只有一條股道,火車只能倒著從西方出去,而且每列火車必須進站,先進後出。某生 不就是個棧嗎?每次可以讓右側頭火車進棧,...
火車進棧(DFS
這裡有n列火車將要進站再出站,但是,每列火車只有1節,那就是車頭。這n列火車按1到n的順序從東方左轉進站,這個車站是南北方向的,它雖然無限長,只可惜是乙個死胡同,而且站台只有一條股道,火車只能倒著從西方出去,而且每列火車必須進站,先進後出。也就是說這個火車站其實就相當於乙個棧,每次可以讓右側頭火車進...
演算法競賽高階指南 0x11 (棧)火車進棧
兩個操作圖中1操作是火車進棧,2是火車出棧,因為要按照字典序輸出,應該先執行操作2,執行操作1來保證字典序正確 直接用dfs來暴力模擬過程,即可輸出答案 include using namespace std int n,cnt 20 vector int state1 stack int stat...