step 1:
初始化初始節點資訊和目的節點資訊
void chushihua(node& s,node& g)
step 2:
計算初始節點與目標節點的逆序數,判斷初始節點與目的節點是否可達,若不可達,則輸出「無解」,若可達,則轉至step 3
void nixushu(node &s,node &g)
step 3:
對於全域性擇優搜尋
void opencloseoperator(node s0,node sg)
step 3.1
將初始節點放入open表中
step 3.2
從open表中取出乙個節點node,並將node存入close表中
step 3.3
判斷node是否為目標節點。
bool judge(node s, node g)
若是,則將路徑資訊輸出,並輸出最小移動步數,求解結束,
否則,移動node節點中的空格,查詢符合移動方向且可到達的後繼節點,並求出後繼節點的估計值,將後繼節點加入到open表中。
void move(node& s, node g)
#include
#include
#include
"stdlib.h"
#include
using
namespace std;
#define num 9
struct node};
priority_queue open;
//open表
queue close;
//close表
int count1=
0,count2=0;
//用於逆序數判斷
/*初始化初始棋局與目標棋局*/
void
chushihua
(node& s,node& g)
cout<<
"目標狀態:"
<
for(i=
0;i<
9;i++
) cout<<
"**********=="
<
}/*判斷逆序數奇偶性*/
void
nixushu
(node &s,node &g)
}/*獲取當前節點與目標節點位置不同的個數*/
intgujihanshu
(node a,node g)
/*判斷node是否為目標節點*/
bool
judge
(node s, node g)
}return
true;}
/*空格移動*/
void
move
(node& s, node g)
/* 獲取估計值,把子節點加入open表中 */
tempnode.parent =
&s; tempnode.h =
gujihanshu
(tempnode, g)
; open.
push
(tempnode);}
}}/*全域性擇優搜尋,對open表和close表操作*/
void
opencloseoperator
(node s0,node sg)
else
} cout <<
"至少要移動"
<< close.
size()
-1<<
"步"<< endl;
搜尋 八數碼問題
搜尋 高階列舉 有順序有策略地列舉狀態空間中的節點,尋找問題 的解 狀態空間 由所有狀態構成的狀態樹 經典八數碼問題 有乙個3 3的棋盤,其中有0 8共9個數字,0表示空 格,其他的數字可以和0交換位置。求由初始狀態 到達目標狀態的步數最少的解?8 2 3 1 4 6 5 7 0 1 2 3 4 5...
A 搜尋 八數碼問題
八數碼問題,簡單地來描述是這樣的 在乙個九宮格內,填有1 2 3 4 5 6 7 8,八個阿拉伯數字,有乙個格仔為空白。就下面這樣,這是乙個沒有歸位的九宮格。12 3784 65 未歸位的九宮格 對於上面這個九宮格,我們要通過移動數字來使之歸位,每次移動都只能是與空白格相鄰的數字移到空白格裡面。最終...
搜尋 HOJ 1868 八數碼
my tags edit source hcpc 2005 spring time limit 2 sec memory limit 32 m submitted 1434,accepted 399 在 3 3 的棋盤上有 8 個將牌,每乙個將牌都刻有 1 8 數碼中的某乙個數碼。棋盤中留有乙個空格...