POJ 1324 Holedox Moving(A*+状态压缩)
来源:互联网 发布:br是什么软件 编辑:程序博客网 时间:2024/05/17 06:35
//// main.cpp// Richard//// Created by 邵金杰 on 16/8/25.// Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;struct node{ int x,y,s,t,f; bool operator < (const node &e) const { return f>e.f; }};struct Point{ int x[10],y[10];}state;int vis[22][22][1<<15];int n,m,l,k;int map[25][25];int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};int encode(){ int s=0; for(int i=l-1;i>0;i--) { int dir=0; int dirx=state.x[i]-state.x[i-1]; int diry=state.y[i]-state.y[i-1]; if(dirx==1&&diry==0) dir=2; else if(dirx==0&&diry==1) dir=1; else if(dirx==-1&&diry==0) dir=0; else if(dirx==0&&diry==-1) dir=3; s<<=2;s|=dir;//先腾出位置再放进去,反一反WA } return s;}node move(node a,int i){ node p=a; int dir=0; p.x=a.x+dx[i]; p.y=a.y+dy[i]; int x=-dx[i],y=-dy[i]; if(x==-1&&y==0) dir=0; else if(x==0&&y==1) dir=1; else if(x==1&&y==0) dir=2; else if(x==0&&y==-1) dir=3; p.s<<=2; p.s|=dir; p.s&=((1<<((l-1)*2))-1); return p;}Point decode(node s){ Point p; p.x[0]=s.x;p.y[0]=s.y; for(int i=1;i<l;i++) { int dir=3; dir&=s.s; s.s>>=2; p.x[i]=p.x[i-1]+dx[dir]; p.y[i]=p.y[i-1]+dy[dir]; } return p;}bool judge(node e,node s){ if(e.x<1||e.x>n||e.y<1||e.y>m) return false; if(map[e.x][e.y]==1) return false; if(vis[e.x][e.y][e.s]==1) return false; Point ss=decode(s); for(int i=0;i<l;i++) if(e.x==ss.x[i]&&e.y==ss.y[i]) return false; return true;}void Astar(node s){ memset(vis,0,sizeof(vis)); priority_queue<node> pq; pq.push(s); vis[s.x][s.y][s.s]=1; node e; while(!pq.empty()) { s=pq.top(); pq.pop(); if(s.x==1&&s.y==1) {printf("%d\n",s.t);return ;} for(int i=0;i<4;i++) { e=move(s,i); if(!judge(e,s)) continue; vis[e.x][e.y][e.s]=1; e.t=s.t+1; e.f=e.t+e.x+e.y; pq.push(e); } } printf("-1\n");}int main(){ int kase=0; while(scanf("%d%d%d",&n,&m,&l)&&(n+m+l)) { memset(map,0,sizeof(map)); for(int i=0;i<l;i++) scanf("%d%d",&state.x[i],&state.y[i]); scanf("%d",&k); int x,y; for(int i=0;i<k;i++){ scanf("%d%d",&x,&y); map[x][y]=1; } node s; s.x=state.x[0],s.y=state.y[0]; s.t=0; s.f=s.t+s.x+s.y; s.s=encode(); printf("Case %d: ",++kase); Astar(s); } return 0;}
0 0
- POJ 1324 Holedox Moving 状态压缩+A* -
- POJ 1324 Holedox Moving(A*+状态压缩)
- POJ 1324 Holedox Moving(状态压缩BFS)
- poj 1324 Holedox Moving(bfs+状态压缩)
- POJ 1324 Holedox Moving 贪吃蛇 状态压缩 BFS
- POJ-1324:Holedox Moving(BFS+状态压缩+蛇蛇历险记)
- hdu1324 Holedox Moving (bfs+状态压缩+A*)
- poj 1324 Holedox Moving (贪吃蛇 状态压缩存蛇的状态)
- Poj 1324 Holedox Moving (A*)
- POJ1324 Holedox Moving(状态压缩+BFS)
- POJ 1324Holedox Moving (状态BFS)
- Toj 1116 Poj 1324(A*搜索) Holedox Moving
- 【POJ 1324】Holedox Moving A*宽搜
- poj 1324 Holedox Moving
- POJ-1324-Holedox Moving
- poj 1324 Holedox Moving
- POJ 1324 Holedox Moving
- POJ - 1324 Holedox Moving
- Labyrinth
- Java实用类库相关地址
- C++关于结构体对齐
- 郭霖大神的Volley教程
- OC-自动释放池、多态、协议
- POJ 1324 Holedox Moving(A*+状态压缩)
- OpenStack future live-migration
- Linux 常用 ls 命令及作用
- TCP/IP协议与UDP协议的区别
- 数据结构实验之查找一:二叉排序树
- Hadoop集成Hue详解
- Spring boot中使用log4j记录日志
- HDU 5438 Ponds(拓扑排序+dfs)
- Eclipse下Maven报错提示:-Dmaven.multiModuleProjectDirectory system propery is not set.