廣搜 九數碼問題

2021-08-21 07:11:17 字數 1479 閱讀 8702

這是乙個很古老的遊戲了:有乙個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 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...