首页 > 代码库 > UVALive-6665-Dragons Cruller(BFS+Hash)
UVALive-6665-Dragons Cruller(BFS+Hash)
题目在此
思路:很经典的搜索。时间比较紧,用map会T。hash函数用了 康托展开。
#include <cstdio> #include <queue> #define INF 99999999 using namespace std; struct S{ int pos,mp[9],step; bool operator<(const S &p) const { return step>p.step; } }t; int fact[9]={1,1,2,6,24,120,720,5040,40320};//康托展开需要用到 inline int hashval(const int *s)//康托展开 { int sum=0; for(int i=0;i<9;i++) { int num=0; for(int j=0;j<i;j++) if(s[j]>s[i]) num++; sum+=(num*fact[i]); } return sum; } int vis[362800],nxt[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int main() { int a,b,i,goal[9],key,oldpos,nx,ny; while(~scanf("%d%d",&a,&b) && a+b) { for(i=0;i<9;i++) { scanf("%d",&t.mp[i]); if(!t.mp[i]) t.pos=i; } for(i=0;i<9;i++) scanf("%d",&goal[i]); priority_queue<S>que; for(i=0;i<362800;i++) vis[i]=INF; t.step=0; que.push(t); vis[hashval(t.mp)]=0; while(!que.empty()) { t=que.top(); for(i=0;i<9;i++) if(t.mp[i]!=goal[i]) break; if(i==9) { printf("%d\n",t.step); break; } que.pop(); for(i=0;i<4;i++) { oldpos=t.pos; nx=t.pos/3+nxt[i][0]; ny=t.pos%3+nxt[i][1]; if(nx==3) nx=0; if(nx==-1) nx=2; if(ny==3) { ny=0; nx++; if(nx==3) nx=0; } if(ny==-1) { ny=2; nx--; if(nx==-1) nx=2; } swap(t.mp[nx*3+ny],t.mp[oldpos]); if(i<2) t.step+=a; else t.step+=b; key=hashval(t.mp); if(t.step<vis[key]) { t.pos=nx*3+ny; vis[key]=t.step; que.push(t); } if(i<2) t.step-=a; else t.step-=b; swap(t.mp[nx*3+ny],t.mp[oldpos]); t.pos=oldpos; } } } }
UVALive-6665-Dragons Cruller(BFS+Hash)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。