題目描述:
八方塊移動遊戲要求從一個含8個數字(用1-8表示)的方塊以及一個空格方塊(用0表示)的3x3矩陣的起始狀態開始,不斷移動該空格方塊以使其和 相鄰的方塊互換,直至達到所定義的目標狀態。空格方塊在中間位置時有上、下、左、右4個方向可移動,在四個角落上有2個方向可移動,在其餘位置上有3個方 向可移動。例如,假設一個3x3矩陣的初始狀態爲:
8 0 3
2 1 4
7 6 5
目標狀態爲:
1 2 3
8 0 4
7 6 5
則一個合法的移動路徑爲:
8 0 3 8 1 3 8 1 3 0 1 3 1 0 3 1 2 3
2 1 4 => 2 0 4 => 0 2 4 => 8 2 4 => 8 2 4 => 8 0 4
7 6 5 7 6 5 7 6 5 7 6 5 7 6 5 7 6 5
另外,在全部可能的從初始狀態到目標狀態的移動路徑中,步數最少的路徑被稱爲最短路徑;在上面的例子中,最短路徑爲5。若是不存在從初試狀態到目標狀態的任何路徑,則稱該組狀態無解。
請設計有效的(細節請見評分規則)算法找到從八方塊的某初試狀態到某目標狀態的全部可能路徑中的最短路徑,並用C/C++實現。
輸入數據:
程序需讀入已被命名爲start.txt的初始狀態和已被命名爲goal.txt的目標狀態,這兩個文件都由9個數字組成(0表示空格,1-8表示8個數字方塊),每行3個數字,數字之間用空格隔開。
輸出數據
:
若是輸入數據有解,輸出一個表示最短路徑的非負的整數;若是輸入數據無解,輸出-1。
自測用例
:
若是輸入爲:八方塊移動遊戲要求從一個含8個數字(用1-8表示)的方塊以及一個空格方塊(用0表示)的3x3矩陣的起始狀態開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態。空格方塊在中間位置時有上、下、左、右4個方向可移動,在四個角落上有2個方向可移動,在其餘位置上有3個方向可移動。例如,假設一個3x3矩陣的初始狀態爲:
8 0 3
2 1 4
7 6 5
目標狀態爲:
1 2 3
8 0 4
7 6 5
則一個合法的移動路徑爲:
8 0 3 8 1 3 8 1 3 0 1 3 1 0 3 1 23
2 1 4 => 2 0 4 => 0 2 4=> 8 2 4 => 8 2 4 => 8 0 4
7 6 5 7 6 5 7 6 5 7 6 5 7 6 5 7 65
另外,在全部可能的從初始狀態到目標狀態的移動路徑中,步數最少的路徑被稱爲最短路徑;在上面的例子中,最短路徑爲5。若是不存在從初試狀態到目標狀態的任何路徑,則稱該組狀態無解。
請設計有效的(細節請見評分規則)算法找到從八方塊的某初試狀態到某目標狀態的全部可能路徑中的最短路徑,並用C/C++實現。
輸入數據:
程序需讀入已被命名爲start.txt的初始狀態和已被命名爲goal.txt的目標狀態,這兩個文件都由9個數字組成(0表示空格,1-8表示8個數字方塊),每行3個數字,數字之間用空格隔開。
輸出數據:若是輸入數據有解,輸出一個表示最短路徑的非負的整數;若是輸入數據無解,輸出-1。
自測用例:
若是輸入爲:start.txt和goal.txt,則產生的輸出應爲:
5
又例,若是用
7 8 4
3 5 6
1 0 2
替換start.txt中的內容,則產生的輸出應爲:
21
評分規則:
1
)咱們將首先使用和自測用例不一樣的10個start.txt以及相同的goal.txt,每一個測試用例的運行時間在一臺Intel Xeon 2.80GHz 4CPU/6G 內存的Linux機器上應不超過10秒(內存使用不限制),不然該用例不得分;
2
)每一個選手的總分(精確到小數點後6位)=10秒鐘內能產生正確結果的測試用例數量x10+(1/產生這些正確結果的測試用例的平均運行毫秒);
3
)若是按此評分統計仍不能得出總決賽將決出的1、2、三等獎共計九名獲獎者,咱們將先設N=2,而後重複下述過程直至產生最高的9位得分:用隨機生成的另外10個有解的start.txt再作測試,並對這10*N個測試用例用2)中公式從新計算總分,N++。,則產生的輸出應爲:
5
又例,若是用
7 8 4
3 5 6
1 0 2
替換start.txt中的內容,則產生的輸出應爲:
21
評分規則:
1
)咱們將首先使用和自測用例不一樣的10個start.txt以及相同的goal.txt,每一個測試用例的運行時間在一臺Intel Xeon 2.80GHz 4CPU/6G 內存的Linux機器上應不超過10秒(內存使用不限制),不然該用例不得分;
2
)每一個選手的總分(精確到小數點後6位)=10秒鐘內能產生正確結果的測試用例數量x10+(1/產生這些正確結果的測試用例的平均運行毫秒);
3
)若是按此評分統計仍不能得出總決賽將決出的1、2、三等獎共計九名獲獎者,咱們將先設
N=2
,而後重複下述過程直至產生最高的
9
位得分:用隨機生成的另外
10
個有解的
start.txt
再作測試,並對這
10*N
個測試用例用
2
)中公式從新計算總分,
N++
。