雙向廣搜 八數碼

2021-07-24 06:36:24 字數 1031 閱讀 8696

雙向廣搜還是乙個很神奇的東西

//判重更神奇;

雙廣僅適用於有目標狀態的題目;

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxx=362880 + 5;

const int mo=1e6+7;

struct recq[maxx/2];

int b[4][4]=,,,};

int zx[5]=,

zy[5]=;

int vis[1000007],dis[1000007];

int h=0,t=1;

int incode(int

x) }

return ans%mo;

}void bfs()

else

if(vis[nt]!=vis[ct])

else t--;}}

}}int main()

}bfs();

return

0;}

其實就是在原來的廣搜佇列裡開始多push了乙個終點狀態,每次產生乙個新狀態的vis有兩種一種是從正向拓展來的另一種是反向拓展來的,其他和正常搜一樣,拓展節點的時候若vis=true判斷是哪個方向來的,如果是從反方向來的那麼結束搜尋return dis[當前head節點]+dis[拓展到的節點]+1;

下面是普通廣搜和雙向廣搜執行時間比較:

ps:判重真是個好東西,真得好好學;

八數碼 廣搜)

時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...

八數碼 單向廣搜

八數碼 poj1077 八數碼問題是人工智慧中的經典問題 有乙個3 3的棋盤,其中有0 8共9個數字,0表示空格,其他的數字可以和0交換位置。求由初始狀態 到達目標狀態 1 2 3 4 5 6 7 8 0 的步數最少的解 給定排列求序號 整數 1,2 k的乙個排列 a1 a2 a3 ak 求其序號 ...

八數碼問題(廣搜)

題目 描述 在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入 輸入乙個給定的狀態。輸出 輸出到達目標狀態的最小步數。不能到達時輸出 1。輸入樣例 1 2 3 4 0 6 ...