思路:相信不少小夥伴上來就是暴力dfs,但是拿到題之後我們不妨想一想如果純dfs爆搜下來會產生多少種狀態,這樣的方法是否是最優的?
這裡選擇使用一種稱之為雙向搜尋的方法(通過知乎學到的,放出來share一下),具體來說就是若已知初始狀態和終止狀態下我們同時從起點和終點開始dfs【當然也有bfs寫法,這裡先用dfs】,和普通dfs不同的是,我們每次dfs的時候都會規定乙個最大深度,而這個最大深度是遞增的,例如第一次dfs的時候最大深度d=0,第二次為1,...,以此類推,而每次更新完d後需要從起點和終點重新出發dfs。
但是可能很多人會有疑問,每次這樣重複的從頭開始搜,豈不是比爆搜還慢???我們看一張圖先【出處:
我們發現這個通過爆搜得到的解答樹其複雜度往往是由樹的最後一層葉子節點的數量決定的!因此我們的雙向搜尋演算法能達到和廣搜相近的時間複雜度,並且能夠換來比bfs更低的空間複雜度!
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 1e18
#define maxn 2005
#define ll long long
int d;
int e=;
bool found;
unordered_maph;
int findzero(int x,int i)
return x-findzero(x,i)*e[i]+findzero(x,i)*e[p];
}void dfs(int x,int p,int d,int dir)
int main(void)
dfs(ed,4,0,2);
if(found)
d++;
} return 0;
}
洛谷OJ P1379 八數碼難題 解題報告
by medalplus 題目描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實...
洛谷 1379 八數碼難題
題目 八數碼難題 思路 bfs hash判重。注意 1 hash的鍊錶不能寫錯。2 由於用的是一位陣列,所以移動時要判斷左右邊界。比如當前的空位在5處,就不能向右移 1。0 1 2 3 4 5 6 7 8 include include include include include include...
洛谷 1379 八數碼難題
在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...