一、目的:許多的計算機科學領域是使用簡單,抽象的觀念來進行分析和實驗的研究。因此這個問題的
目的是如何在特定的規則和條件下透過有限的命令來讓目標達成某種特定的狀態,而不是直
接讓目標去達成某種特定的狀態。(連結UVa online原文題庫)
二、問題說明:
解析一系列的命令來指示機器手臂如何去操作位於桌子上的區塊,初始時桌子上有n個區塊
(編號為0~n-1)並且依編號由小而大依序排列,如下圖所示:
程式必須提供下列五種不同的命令來操作上述的區塊:
1、move a onto b 一
將a區塊放至b區塊的上方,但是如果a或b區塊上方有其他的區塊時則必須先將上方的區塊
移至該區塊的初始位置。
2、move a over b 一
將a區塊放至b區塊所在的堆疊上方,但是如果a區塊上方有其他的區塊時則必須先將上方
的區塊移至該區塊的初始位置,而b區塊則不做任何的處理。
3、pile a onto b 一
將包含a區塊上方所有堆疊的區塊移至b區塊的上方,但是如果b區塊上方有其他的區塊時
則必須先將上方的后塊移至該區塊的初始位置。
4、pile a over b 一
將直接將包含a區塊上方所有塊疊的區塊移至b區塊所在的堆疊上方。
5、quit 一 結束操作並顯示最後的區塊狀態。
限制: 當a區塊和b區塊在同一個堆疊時將視為不合法的命令則所有不合法的命令必須忽略和不能
對其結果造成影響。
EX: Sample Input Sample Output
10 ==> 0: 0
move 9 onto 1 1: 1 9 2 4
move 8 over 1 2:
move 7 over 1 3: 3
move 6 over 1 4:
pile 8 over 6 ==> 5: 5 8 7 6
pile 8 over 5 6:
move 2 over 1 7:
move 4 over 9 8:
quit ==> 9:
三、輸出與輸入的規則:
在開始輸入命令之前必須先輸入一個整數用來表示總共有多少個區塊(0<n<25);接著依照輸入
命令的順序來移動區塊位置直到遇到quit命令為止。輸出時必須依序輸出每一位置的區塊狀態,
當某一位置的區塊量不止一個時則必須依照移動的先後順序輸出;此外在位置編號和區塊編號之
間必須加上一個「:」而兩個區塊區塊編號之間必須加上一個空格作為區隔。
四、演算法說明:
因為這個問題需要不斷的搬移資料內容,因此採用串列的資料結構(Link List)來解答此問題。
4-1、建立Link List的資料結構用來表示區塊的資料。
4-2、建立一個指標列陣列並依序指向同編號的區塊。
4-3、建立InitialBlock函式 - 產生指標陣列並指向同編號的區塊和初始化區塊的資料。
4-4、建MoveBlock函式 - 將來源的區塊堆疊移至目標的區塊堆疊。
4-5、建立ReturnPos函式 - 將指定區塊上方的所有區塊移至初始的位置。
4-6、組合上述兩個函式來滿足指令的條件。
Run time of UVa online web : 0.008 ~ 0016
Download : UVa101_TheBlocksProblem.tar.gz
Result: