C 解決列車重排問題

2022-07-21 04:21:10 字數 1879 閱讀 3397

問題節選自《資料結構、演算法與應用(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 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...