HDU 1430+BFS
2012-11-13 13:36
239 查看
这道题一看,暴力bfs去搞,超时,康拓hash下还是超时,结果看大牛博客,才知道。。对于一个状态到另一个状态都可以转化为12345678到另一个状态,中间只需置换下即可,这样的话,只要一次bfs预处理出所有情况就可以了。。不需要每个case都搜一遍。。。
#include<cstdio> #include<queue> #include<map> #include<string> #include<algorithm> #include<iostream> using namespace std; struct node { string str; string step; int va; }; string s,t; int vi[50000]; string dp[50000]; int pos[10]; int func[10]; int hash(string &s) { int va=0; for(int i=0;i<7;i++) { int cnt=0; for(int j=i+1;j<8;j++) if(s[j]<s[i]) cnt++; va+=cnt*func[7-i]; } return va; } void gao1(string &s) { for(int i=0;i<4;i++) swap(s[i],s[i+4]); } void gao2(string &s) { char t=s[3]; for(int i=2;i>=0;i--) s[i+1]=s[i]; s[0]=t; t=s[7]; for(int i=6;i>=4;i--) s[i+1]=s[i]; s[4]=t; } void gao3(string &s) { char tp=s[1]; s[1]=s[5]; s[5]=s[6]; s[6]=s[2]; s[2]=tp; } void bfs() { memset(vi,0,sizeof(vi)); queue<node>q; node ss,tt; ss.str=s; ss.step=""; ss.va=hash(s); q.push(ss); vi[ss.va]=1; dp[ss.va]=""; while(!q.empty()) { ss=q.front(); q.pop(); string t=ss.str; int k; gao1(t); k=hash(t); if(!vi[k]) { tt.str=t; vi[k]=1; tt.step=ss.step+'A'; tt.va=k; dp[k]=tt.step; q.push(tt); } t=ss.str; gao2(t); k=hash(t); if(!vi[k]) { tt.str=t; vi[k]=1; tt.step=ss.step+'B'; tt.va=k; dp[k]=tt.step; q.push(tt); } t=ss.str; gao3(t); k=hash(t); if(!vi[k]) { tt.str=t; vi[k]=1; tt.step=ss.step+'C'; tt.va=k; dp[k]=tt.step; q.push(tt); } } } int main() { func[0]=1; for(int i=1;i<=9;i++) func[i]=func[i-1]*i; s="12345678"; bfs(); while(cin>>s>>t) { swap(s[4],s[7]); swap(s[5],s[6]); swap(t[4],t[7]); swap(t[5],t[6]); for(int i=0;i<8;i++) pos[s[i]-'0']=i+1; for(int i=0;i<8;i++) t[i]=pos[t[i]-'0'];/*置换*/ int k=hash(t); cout<<dp[k]<<endl; } return 0; }
相关文章推荐
- ACM-康托展开+预处理BFS之魔板——hdu1430
- hdu1430 (bfs)
- HDU - 1430 魔板 (bfs预处理 + 康托)
- HDU 1430 魔板 康托展开或字典树 + BFS
- HDU 1430 魔板 (BFS)
- hdu 1430 (BFS 康托展开 或 map )
- HDU 2102 双层bfs
- HDU 1181 变形记 (BFS)
- HDU 2471 History of Languages(自动机BFS)
- HDU-OJ 杭电2612 Find a way 双层BFS
- 【搜索入门专题1】 hdu1242 J - Rescue c++ stl容器之优先队列+BFS
- ZOJ 1091 (HDU 1372) Knight Moves(BFS)
- POJ 1915(与HDU 1372类似,BFS代码都差不多)
- HDU1459 非常可乐(BFS)
- HDU 1728 逃离迷宫 BFS
- hdu 题目1253 胜利大逃亡(BFS)
- HDU 1548 A strange lift(bfs)
- HDU 1240(bfs)
- HDU-2128-Tempter of the Bone II(BFS)
- HDU 1312(BFS)