火車進站問題

2021-07-04 23:26:13 字數 1289 閱讀 4256

描述

給定乙個正整數n代表火車數量,0

知識點棧

執行時間限制

0m記憶體限制0輸入

有多組測試用例,每一組第一行輸入乙個正整數n(0

輸出輸出以字典序排序的火車出站序列號,每個編號以空格隔開,每個輸出序列換行,具體見sample。

樣例輸入

31 2 3

樣例輸出

1 2 3

1 3 2

2 1 3

2 3 1

3 2 1

感覺這道題還是蠻有意思的,不過首先需要讀懂題目的意思。

題目的意思就是給定乙個輸入序列,這個輸入序列按先進先出的順序處理,將這個輸入序列中的元素壓入乙個棧中,問有哪些出棧的順序?

思路為用三個變數分別儲存待進站火車,站中火車和已出站火車,其中待進站火車用queue(佇列)儲存和站中火車採用stack(棧)儲存,已出站火車採用vector來儲存,具體實現是採用遞迴的方法,遞迴函式的引數為當前待進站火車、站中火車、已出站火車的值所組成的三元組,遞迴結束條件是,未進站火車和站中火車均為空,此時輸出已出站火車即為所有出站的一種可能,遞推關係為對於當前情況有讓下一輛火車進站或讓站中的一輛火車出站兩種可能,對於兩種可能分別呼叫遞迴函式,即可得出問題的解。

需要注意的是這道題呼叫遞迴函式的時候回溯不是很好處理,所以直接使用的是傳遞整個容器,不過這樣處理效率不是很高,但是暫時沒有想到更好的方法。

#include #include #include #include #include using namespace std;

void dispatch(queueinput,stackcurrent,vectoroutput)

cout<

cout

vectoroutputtmp=output;

outputtmp.push_back(currenttmp.top());

currenttmp.pop();

dispatch(input,currenttmp,outputtmp);

} //火車站中有火車要入棧

if(hasinput) }

int main()

//呼叫分配函式

dispatch(input,current,output);

} getchar();

return 0;

}

下面是測試用例:

火車進站問題

給定乙個正整數n代表火車數量,0 比如火車進站 序列問題 c include include include include using std stack using std vector using namespace std bool ispoporder const int put orde...

火車進站出站問題

火車編號為 1 9,且不重複。如 編號分別為 1 2 3 4 5 的5個火車順序進站,那麼進站序列為 12345 全部進站後再順序出站,則出站序列為 54321 如果先進1,2,然後2出站,然後1出站,然後再3進站 出站,4進站 出站,5進站 出站,那麼出站序列就為21345.問題分析 棧具有先進後...

77 火車進站

題目描述 給定乙個正整數n代表火車數量,0輸出描述 輸出以字典序從小到大排序的火車出站序列號,每個編號以空格隔開,每個輸出序列換行,具體見sample。示例1輸入 31 2 3 輸出1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 此處所謂字典序排序的意思是這n輛火車有多少種出站的可能順序...