這是乙個很古老的遊戲了:有乙個3 × 3的活動拼盤(如下圖),方格上寫有0~8這九個數字。例如:
3 7 5
2 6 1
4 8 0
利用拼盤背後的旋鈕,遊戲者每次可以進行以下兩種操作之一:1.將拼盤外圍的8個方格按順時針挪乙個位置。2.將中間一行向右移動乙個位置,最右邊的方格被移到最左邊。例如:給你乙個拼盤的初始狀態,你能用最少的操作次數把拼盤變成下圖所示的目標狀態嗎?
0 1 2
3 4 5
6 7 8 本題有多組測試資料。
輸入檔案中包含三行三列九個數,同行的相鄰兩數用空格隔開,表示初始狀態每個方格上的數字。初始狀態不會是目標狀態。如果目標狀態無法達到,則輸出「unsolvable」(引號不輸出)。否則,輸出最少的操作次數。
多組資料從目標狀態反搜預處理每乙個狀態的最小步數,康拓展開去重,詢問時判斷有無,輸出即可。
#include#include#include#include#include#include#includeusing namespace std;
struct que
;int mu[4][4],qi[4][4],dx[4]=,dy[4]=;
int f[10]=;
bool h[10000005];
int ans[10000005];
int key1,key2;
queueq;
void init()
int key(int a[4])
ans+=tmp*f[11-i];
} return ans;
}bool hash(int a[4])
bool bfs()
printf("\n");
} getchar();*/
q.pop();
swap(u.a[2][1],u.a[2][3]);
swap(u.a[2][1],u.a[2][2]);
if(hash(u.a))
swap(u.a[2][1],u.a[2][2]);
swap(u.a[2][1],u.a[2][3]);
swap(u.a[1][1],u.a[2][1]);
swap(u.a[1][1],u.a[3][1]);
swap(u.a[1][1],u.a[3][2]);
swap(u.a[1][1],u.a[3][3]);
swap(u.a[1][1],u.a[2][3]);
swap(u.a[1][1],u.a[1][3]);
swap(u.a[1][1],u.a[1][2]);
if(hash(u.a))
}}int main()
key1=key(mu);
if(ans[key1]>=0) printf("%d\n",ans[key1]);
else printf("unsolvable\n");
}}
八數碼問題(廣搜)
題目 描述 在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入 輸入乙個給定的狀態。輸出 輸出到達目標狀態的最小步數。不能到達時輸出 1。輸入樣例 1 2 3 4 0 6 ...
8數碼問題 深搜 廣搜
8數碼問題的廣搜在網上可以找到 廣搜一般可以找到最優解,但是深搜不一定能找到最優解。一般的深搜多是指定最大遞迴深度的深搜,一般情況下,問題解的深度很難確定。因此深蒐會出現三種情況,一是找到最優解,二是在迭代深度內找不到解,三是找到解但不是最優解。第一種情況自然是最好的,不過較經常出現的是第三種,在指...
c 八數碼問題(廣搜)
時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...