雙向廣搜還是乙個很神奇的東西
//判重更神奇;
雙廣僅適用於有目標狀態的題目;
#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 ...