Posted on 2008-10-16 09:19
歲月流逝 閱讀(109)
評論(0) 編輯 收藏 引用
題目描述:
八方塊移動游戲要求從一個含8個數(shù)字(用1-8表示)的方塊以及一個空格方塊(用0表示)的3x3矩陣的起始狀態(tài)開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態(tài)。空格方塊在中間位置時有上、下、左、右4個方向可移動,在四個角落上有2個方向可移動,在其他位置上有3個方向可移動。例如,假設一個3x3矩陣的初始狀態(tài)為:
8 0 3
2 1 4
7 6 5
目標狀態(tài)為:
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
另外,在所有可能的從初始狀態(tài)到目標狀態(tài)的移動路徑中,步數(shù)最少的路徑被稱為最短路徑;在上面的例子中,最短路徑為5。如果不存在從初試狀態(tài)到目標狀態(tài)的任何路徑,則稱該組狀態(tài)無解。
請設計有效的(細節(jié)請見評分規(guī)則)算法找到從八方塊的某初試狀態(tài)到某目標狀態(tài)的所有可能路徑中的最短路徑,并用C/C++實現(xiàn)。
輸入數(shù)據(jù):
程序需讀入已被命名為start.txt的初始狀態(tài)和已被命名為goal.txt的目標狀態(tài),這兩個文件都由9個數(shù)字組成(0表示空格,1-8表示8個數(shù)字方塊),每行3個數(shù)字,數(shù)字之間用空格隔開。
輸出數(shù)據(jù):
如果輸入數(shù)據(jù)有解,輸出一個表示最短路徑的非負的整數(shù);如果輸入數(shù)據(jù)無解,輸出-1。
自測用例:
如果輸入為:start.txt和goal.txt,則產(chǎn)生的輸出應為:
5
又例,如果用
7 8 4
3 5 6
1 0 2
替換start.txt中的內(nèi)容,則產(chǎn)生的輸出應為:
21
評分規(guī)則:
1)我們將首先使用和自測用例不同的10個start.txt以及相同的goal.txt,每個測試用例的運行時間在一臺Intel Xeon 2.80GHz 4 CPU/6G 內(nèi)存的Linux機器上應不超過10秒(內(nèi)存使用不限制),否則該用例不得分;
2)每個選手的總分(精確到小數(shù)點)=10秒鐘內(nèi)能產(chǎn)生正確結(jié)果的測試用例數(shù)量x10+(1/產(chǎn)生這些正確結(jié)果的測試用例的平均運行毫秒);
3)如果按此評分統(tǒng)計仍不能得出總決賽將決出的一、二、三等獎共計九名獲獎者,我們將先設N=2,然后重復下述過程直至產(chǎn)生最高的9位得分:用隨機生成的另外10個有解的start.txt再做測試,并對這10*N個測試用例用2)中公式重新計算總分,N++。