Vijos 八數碼問題

2021-08-09 08:45:07 字數 1505 閱讀 6348

背景

yours和zero在研究a*啟發式演算法.拿到一道經典的a*問題,但是他們不會做,請你幫他們.

在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局(為了使題目簡單,設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。

輸入初試狀態,一行九個數字,空格用0表示

只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)

283104765
copy

4

1/*2

搜尋過程沒什麼好說的

3我只想說一下hash

4這個判重好坑 資料太細了!

5只好用康拓展開 6*/

7 #include8 #include9 #include10

#define maxn 1000010

1112

using

namespace

std;

1314

int map[3][3

],x,y,head,tail;

1516

int _x[4]=;

17int _y[4]=;

1819

struct

node ;

22node e[maxn];

2324

char s[10

];25

26int

step[maxn];

2728

bool _hash[67338000

],flag;

2930 inline void

_pre()

37 x=0;y=0;38

return;39

}4041 inline bool

__hash()

48//

_inr%=373897779;

49if(!_hash[_inr])

53return

false;54

}5556 inline bool pd(int i,int

j) 59

60 inline bool

check()

6667 inline void move(int p,int

q) 83

if(__hash()) tail++;84}

85}86}

8788 inline void

search()

95 head++;96}

97}9899

intmain()

107 tail++;

108search();

109return0;

110 }

**

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...

八數碼問題

八數碼問題 題意 編號為1 8的8個正方形滑塊被擺成3行3列 有乙個格仔留空 如下圖所示 每次可以把與空格相鄰的滑塊 有公共邊才算相鄰 移到空格中,而他原來的位置 就成為了新的空格。如果無法到達目標局面,則輸出 1。2 6 4 13 75 8 移到後 8 1 5 73 642 樣例輸入 2 6 4 ...