设为首页 加入收藏

TOP

UVALive-6665-Dragons Cruller(BFS+Hash)
2015-07-20 17:36:30 来源: 作者: 【 】 浏览:3
Tags:UVALive-6665-Dragons Cruller BFS Hash

题目在此


思路:很经典的搜索。时间比较紧,用map会T。hash函数用了 康托展开。


#include 
  
   
#include 
   
     #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
    
     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
     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
      
       

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇NYOJ-a letter and a number 下一篇hdu 5030 Rabbit's String(后..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)