//
// 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;
}
POJ 1324 Holedox Moving(A*+状态压缩)
最新推荐文章于 2019-09-11 14:10:41 发布