POJ-1324-Holedox Moving

来源:互联网 发布:js获取选择的select 编辑:程序博客网 时间:2024/06/06 16:35

这个题好像算比较麻烦的一道BFS题,做了2个小时的样子,主要还是需要状态压缩。特别是对蛇身体的位置进行压缩,注意位运算的存入和取出的操作,因为存整个蛇身的位置是不现实的,只能存蛇身块之间的相对位置,这样的话只要知道蛇头,那么整条蛇都能够找到。

网上看到好多人对这个题进行一次又一次的改进,只能以后看时间了~这份代码时间在1100ms左右,算一般吧,因为我还不会A*算法

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=22;struct node{    int x;    int y;    int pos;    int ans;}q[700000];int n,m,l,k;char map[maxn][maxn];bool vis[maxn][maxn][16400];int sx[11],sy[11],movex[4]={-1,0,1,0},movey[4]={0,1,0,-1};bool eat(int x,int y){    for(int i=0;i<l;i++)if(sx[i]==x&&sy[i]==y)    return true;    return false;}int main(){    int cas=1;    while(scanf("%d%d%d",&n,&m,&l)&&(n+m+l))    {memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));for(int i=0;i<=n+1;i++)    map[i][0]=map[i][m+1]='#';for(int i=0;i<=m+1;i++)    map[0][i]=map[n+1][i]='#';for(int i=0;i<l;i++)    scanf("%d%d",&sx[i],&sy[i]);scanf("%d",&k);for(int i=0;i<k;i++){    int ita,itb;    scanf("%d%d",&ita,&itb);    map[ita][itb]='#';}int res=1,ita=0;for(int i=1;i<l;i++){    if(sx[i]+1==sx[i-1])ita=0;    else if(sy[i]-1==sy[i-1])ita=1;    else if(sx[i]-1==sx[i-1])ita=2;    elseita=3;    res=(res<<2)+ita;}int pre=0,last=1;q[0].x=sx[0];q[0].y=sy[0];q[0].pos=res;q[0].ans=0;vis[sx[0]][sy[0]][res]=1;int ans=-1;while(pre<last){    int x=q[pre].x;    int y=q[pre].y;    int pos=q[pre].pos;    if(x==1&&y==1)    {ans=q[pre].ans;break;    }    sx[0]=x;    sy[0]=y;    ita=pos;    for(int i=1;i<l;i++)    {int index=(l-i-1)*2;if((ita&(1<<index))&&(ita&(1<<(index+1)))){    sx[i]=sx[i-1]+movex[3];    sy[i]=sy[i-1]+movey[3];}else if((ita&(1<<index))&&!(ita&(1<<(index+1)))){    sx[i]=sx[i-1]+movex[1];    sy[i]=sy[i-1]+movey[1];}else if(!(ita&(1<<index))&&(ita&(1<<(index+1)))){    sx[i]=sx[i-1]+movex[2];    sy[i]=sy[i-1]+movey[2];}else{    sx[i]=sx[i-1]+movex[0];    sy[i]=sy[i-1]+movey[0];}    }    ita>>=2;    int index=(l-2)*2;    ita|=(1<<(index+2));    for(int i=0;i<4;i++)    {int itx=x+movex[i];int ity=y+movey[i];if(map[itx][ity]=='#')    continue;if(i==0){    ita&=~(1<<index);    ita|=(1<<(index+1));}else if(i==1){    ita|=(1<<index);    ita|=(1<<(index+1));}else if(i==2){    ita&=~(1<<index);    ita&=~(1<<(index+1));}else{    ita|=(1<<index);    ita&=~(1<<(index+1));}if(vis[itx][ity][ita]||eat(itx,ity))    continue;vis[itx][ity][ita]=1;q[last].x=itx;q[last].y=ity;q[last].ans=q[pre].ans+1;q[last++].pos=ita;    }    pre++;}printf("Case %d: %d\n",cas++,ans);    }    return 0;}


原创粉丝点击