題目鏈結
題意:給你乙個初始狀態,問你能否移動到最終的完成狀態,如果能輸出任意一組解,否則輸出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作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...