1. 程式人生 > 其它 >淺談雙向BFS

淺談雙向BFS

前言:

雙向bfs指知道初狀態和末狀態,從處狀態和末狀態同時廣搜,當一種狀態被搜尋了兩次則說明中間有交織,找到答案。雙向BFS一般會比普通BFS快幾倍甚至幾十倍,當資料較大時。

例題.

八數碼:

程式碼

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n,g=123804765;
short a[4][4],fx,fy,nx,ny;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1}; 
queue<int> q;
map<int,int> v;
map
<int,int> ans; void solve() { if(n==g) { printf("0"); exit(0); } q.push(n); q.push(g); ans[n]=0; ans[g]=1; v[g]=2; v[n]=1; while(q.size()) { ll now,cur=q.front(); q.pop(); now=cur; for(int i=3;i>=1;i--)
for(int j=3;j>=1;j--) { a[i][j]=now%10,now/=10; if(a[i][j]==0) fx=i,fy=j; } for(int i=0;i<4;i++) { nx=fx+dx[i]; ny=fy+dy[i]; if(nx<1 || nx>3 || ny<1 || ny>3) continue ; swap(a[fx][fy],a[nx][ny]); now
=0; for(int p=1;p<=3;p++) for(int j=1;j<=3;j++) now=now*10+a[p][j]; if(v[now]==v[cur]) { swap(a[fx][fy],a[nx][ny]); continue; } if(v[now]+v[cur]==3) { printf("%d",ans[cur]+ans[now]); exit(0); } ans[now]=ans[cur]+1; v[now]=v[cur]; q.push(now); swap(a[fx][fy],a[nx][ny]); } } } int main() { cin>>n; solve(); return 0; }

程式碼應該很好懂。

總結:

如果知道初狀態和終狀態可以考慮用雙向BFS。