問題節選自《資料結構、演算法與應用(c++語言描述)>>, 思路與**為原創, 如有疏漏及問題歡迎指正
問題描述:
一輛列車有n節車廂, 車廂排列亂序(如: 284657139), 但整體車廂序號連續(序號整體沒有斷), 每節車廂要停靠不同的站台.
現有n個車站從1到n編號, 列車按照從1到n的順序經過車站, 列車要在車廂號和車站號相同時, 將車廂卸下, 為了便於解除安裝, 需
要將車廂重新順序排列. 重排後列車只需每次卸下最後一節車廂即可, 為了方便重排, 現有入軌道, 出軌道以及三個緩衝軌道,
規定列車從入軌道入, 可將當前入軌車廂轉入緩衝軌道或直接移至出軌道, 緩衝軌道中的車廂可按從後至前的順序移至出軌
道, 列車出軌道後即完成重排.
抽象:即現有一順序混亂的棧結構, 要將棧內元素重排, 有三個緩衝棧和乙個重排後的結果棧
思路:第一步: 用一變數記錄當前結果棧需要的元素值, 之後初始棧元素順序出棧, 出棧同時判斷是否是結果棧所需要的元素, 是則直接
加入結果棧並將當前記錄值減一, 否則將元素推入緩衝棧.
第二步: 元素入緩衝棧時對三個緩衝棧從左至右進行檢查, 若棧為空, 直接將元素入棧, 否則判斷當前棧的棧頂元素值是否小於當
前元素, 是則推入棧中, 否則跳至下一緩衝棧進行檢查.
第三步: 對當前三個緩衝棧進行檢查, 若當前三個緩衝棧中任意一棧的棧頂元素滿足結果棧需求, 將該元素加入結果棧並將記錄值
減一, 重複當前步驟, 直至緩衝棧棧頂元素均不滿足要求.
重複以上三步即可完成重排
**如下:
1 #include 2 #include 3 #include 4測試5#define buffer_count 2
6#define buffer_start 078
static
int train_number = 9; //
當前重排列車需求
910 std::vectorint>> vec_buffer_stack; //
緩衝軌道
11 std::stack train; //
初始列車
12 std::stack rearrange_train; //
重排列車
1314
void
train_init()
1526
27void
check_train()
2833
34//
當前出棧元素符合重排需求,加入重排列車
35if (train.top() ==train_number)
3643}44
45void
check_buffer()
4664}65
}66}67
68void
push_train()
6974
for (size_t i = buffer_start; i <= buffer_count; ++i)
7586
//車廂序號大於緩衝軌道尾車廂序號,加入當前車廂
87else
if (train.top() >vec_buffer_stack[i].top())
8896}97
}9899void
rearrange_curr_train()
100113
114 }
用佇列實現列車車廂重排
之前寫了用棧實現的列車車廂重排問題,現在來實現用佇列的列車車廂重排問題,用佇列要比用棧簡單。void outputfromholdingtrack bool putinholdingtrack int c else if besttrack 0 besttrack i if besttrack 0 ...
BFS解決九宮重排問題
問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...
BFS解決九宮重排問題
問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...