八數碼全域性擇優搜尋

2021-10-11 22:56:49 字數 2091 閱讀 1285

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 數碼中的某乙個數碼。棋盤中留有乙個空格...