HDU 1043 八數碼問題 雙向BFS

2021-09-29 13:50:58 字數 1404 閱讀 2242

題目鏈結

題意:給你乙個初始狀態,問你能否移動到最終的完成狀態,如果能輸出任意一組解,否則輸出unsolved。

思路:乍一看是個bfs,但是狀態過多會tle或者mle,但是除可bfs確實沒得寫了,這時候就要用到雙向bfs了,起點終點同時bfs,判斷相遇,路徑用string+就行了。

注意點:正向路徑s=s+c,逆向s=c+s;輸出也要注意先輸出正向;

剪枝的話就判斷逆序數就行了;

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

char s[

125]

;map<

int,string>vis1,vis2;

map<

int,

char

>mp;

map<

int,

char

>mpp;

int st=

0,ed=

123456780

,dx,dy,mat[4]

[4],ans=-1

,flag;

int dir[4]

[2]=

,,,}

;struct node

;void

fun(

int ok)

}int

tran()

return ans;

}int

tbfs()

),q2.

push()

; vis1[st]=1

,vis2[ed]=1

;while

(!q1.

empty()

&&!q2.

empty()

) vis1[no]

=f.s+c;

q1.push()

;}else

vis2[no]

=cc+f.s;

q2.push()

;}}}

return-1

;}intmain()

}int k=0;

for(

int i=

1; i<=

8; i++)}

if(k&1)

ans=

tbfs()

;if(ans==-1

)printf

("unsolvable\n");

}}

HDU1043 八數碼問題

include include include using namespace std 通過康托展開來hash 9 有362880 const int maxn 400000 int step maxn int p maxn 2 用於記錄與前面乙個的相對路徑 int d 10 用來統計0到9的階乘 ...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...