八數碼簡單題題解

2021-08-29 05:23:01 字數 2694 閱讀 7609

就是想練習一下雙向廣搜,然後就加強了這一題的資料。

我也不知道其他方法能不能過(實際上就是太懶了,不想寫其他方法。。。)

好啦,回歸正題。

什麼是雙向廣搜?

所謂雙向搜尋指的是搜尋沿兩個方向同時進行:正向搜尋:從初始結點向目標結點方向搜尋;逆向搜尋:從目標結點向初始結點方向搜尋;當兩個方向的搜尋生成同一子結點時終止此搜尋過程。

畫個圖就是這樣(來自網路)

怎麼實現雙向廣搜?

1.需要兩個佇列 (廢話)分別簡記為 qsqs

qsq eqe

qe,兩個標記陣列 vs ve (分別用來記錄兩邊搜尋達到的狀態)。

2.確定初始狀態( sta

rtstart

star

t ) 與目標狀態( end

enden

d ) 。

3.開始搜尋

​ <1> 首先將 sta

rtstart

star

t 放入 qsqs

qs中,end

enden

d 放入 qeqe

qe中。​ <2> 若兩佇列有乙個不為空進行一下迴圈

​ 若 qsqs

qs不為空,取出隊頭元素,若隊頭狀態 veve

ve中已經存在,證明已經找到,退出。

​ 否則,進行擴充套件,將可達的狀態放入 qsqs

qs隊尾中,同時在 vsvs

vs陣列中標記

​ 若 qeqe

qe不為空,取出隊頭元素,若隊頭狀態 vsvs

vs中已經存在,證明已經找到,退出。

​ 否則,進行擴充套件,將可達的狀態放入 qeqe

qe隊尾中,同時在 veve

ve陣列中標記

​ <3> 到達此處說明無解,搜尋結束。

1. 雙向廣搜適用於有確定的初始狀態和目標狀態的搜尋。

2. 初始狀態到達目標狀態最好有解,否則雙向廣搜 甚至

\color\huge}

甚至 不如單向廣搜。

3. qsqs

qs與 qeqe

qe擴充套件判重時,一定要分別判重 (**中有解釋)。

綜上所述,用雙向廣搜來寫八數碼,是比較合適的。(不存在的情況可以用逆序對的奇偶性排除掉)。

**如下

#include

#include

#include

#include

#define maxn 362887

using

namespace std;

int fact[11]

=;struct nodest,en;

node qs[maxn]

,qe[maxn]

;//兩個佇列

int ve[maxn]

,vs[maxn]

;//狀態陣列,記錄到達每種狀態所需的最小步數

inline

void

read

(int

&x)while

(ch>=

'0'&&ch<=

'9')

x*=fl;

}inline

intkt

(node x)

res+

=(tmp*fact[

9-i]);

}return res+1;

}inline

bool

isok

(int ind,

int opt)

else

break

;case2:

if(ind%3==

0)else

break

;case3:

if(ind<=3)

else

break

;case4:

if(ind>6)

else

break;}

return0;

}inline node change

(node x,

int opt)

return x;

}inline

void

dbfs()

for(

int i=

1;i<=4;

++i)}}

if(le<=re)

for(

int i=

1;i<=4;

++i)}}

}printf

("-1\n");

}inline

bool

jud(node x)

}return res%2;

}inline

void

init()

for(

int i=

1;i<=9;

++i)if(

jud(st)

!=jud

(en)

) st.step=

1,en.step=1;

st.t=

kt(st)

,en.t=

kt(en)

;dbfs()

;}}int

main()

題解 八數碼問題

八數碼問題描述 八方塊移動遊戲要求從乙個含 8 個數字 用 1 8 表示 的方塊以及乙個空格方塊 用 0 表示 的 3 3 矩陣的起始狀態開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態。空格方塊在中間位置時有上 下 左 右 4 個方向可移動,在四個角落上有 2個方向可移動,...

八數碼題解(bfs

八數碼分析 本題是求最少交換次數,故先想到bfs,而本題的難點在於狀態和步數的儲存。以及狀態的轉移。如何記錄下x和乙個數交換後的狀態?如何記錄步數?主要思想 乙個巧妙的思想可以解決此類問題,狀態可以用string型別來記錄,求在3 3矩陣中的橫縱座標無非就是將其在string型別中的位序 假設為k ...

codevs 1225 八數碼難題 題解

yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題...