就是想練習一下雙向廣搜,然後就加強了這一題的資料。
我也不知道其他方法能不能過(實際上就是太懶了,不想寫其他方法。。。)
好啦,回歸正題。
什麼是雙向廣搜?
所謂雙向搜尋指的是搜尋沿兩個方向同時進行:正向搜尋:從初始結點向目標結點方向搜尋;逆向搜尋:從目標結點向初始結點方向搜尋;當兩個方向的搜尋生成同一子結點時終止此搜尋過程。
畫個圖就是這樣(來自網路)
怎麼實現雙向廣搜?
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來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題...