poj 1324 状态广搜

其实就是我们经常玩的贪吃蛇。

不过现在我们优先蛇的头的话,要用一个巧妙的哈希来把蛇的身体表达出来,那么就可以用一个4进制的数字来表示,蛇的身体长度最多不超过8,所以最多是2^7种状态。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<cstdio>
  5 #include<cmath>
  6 int const N = 8;
  7 int const M = 22;
  8 int const State = 17000;
  9 struct Snake
 10 {
 11        int bx[N],by[N];
 12        int step;
 13 }cur,nt;
 14 Snake q[1000000];
 15 int head,tail;
 16 int n,m,l,x,y,ans,s;
 17 bool map[M][M],vis[M][M][State];
 18 int dirx[]={0,0,-1,1};
 19 int diry[]={-1,1,0,0};
 20 bool judge(int x,int y)
 21 {
 22      return x<1||x>n||y<1||y>m||map[x][y];
 23 }
 24 int check(int x1,int y1,int x2,int y2)
 25 {
 26     if(x1==x2)
 27     {
 28        if(y1>y2)
 29           return 0;
 30        else
 31           return 1;
 32     }
 33     else
 34     {
 35        if(x1>x2)
 36           return 2;
 37        else
 38           return 3;
 39     }
 40 }
 41 int bfs()
 42 {
 43      cur.step=0;
 44      int state=0;
 45      for(int j=0;j<l-1;j++)
 46          state=state*4+check(cur.bx[j],cur.by[j],cur.bx[j+1],cur.by[j+1]);
 47      vis[cur.bx[0]][cur.by[0]][state]=true;
 48      head=tail=0;
 49      q[tail++]=cur;
 50      while(head<tail)
 51      {
 52            cur=q[head++];
 53            if(cur.bx[0]==1&&cur.by[0]==1)return cur.step;
 54            for(int i=0;i<4;i++)
 55            {
 56                nt.bx[0]=cur.bx[0]+dirx[i];
 57                nt.by[0]=cur.by[0]+diry[i];
 58                nt.step=cur.step+1;
 59                if(judge(nt.bx[0],nt.by[0]))continue;
 60                int f=0;
 61                for(int j=0;j<l;j++)
 62                    if(nt.bx[0]==cur.bx[j]&&nt.by[0]==cur.by[j])
 63                    {
 64                       f=1;break;
 65                    }
 66                if(f)continue;
 67                for(int j=l-1;j>0;j--)
 68                    nt.bx[j]=cur.bx[j-1],nt.by[j]=cur.by[j-1];
 69                int state=0;
 70                for(int j=0;j<l-1;j++)
 71                    state=state*4+check(nt.bx[j],nt.by[j],nt.bx[j+1],nt.by[j+1]);
 72                if(!vis[nt.bx[0]][nt.by[0]][state])
 73                {
 74                   vis[nt.bx[0]][nt.by[0]][state]=true;
 75                   q[tail++]=nt;
 76                }
 77            }
 78      }
 79      return -1;
 80 }
 81 int main()
 82 {
 83     int T=0;
 84     while(~scanf("%d %d %d",&n,&m,&l)&&(n+m+l)!=0)
 85     {
 86           for(int i=1;i<=n;i++)
 87              for(int j=1;j<=n;j++)
 88              {
 89                  map[i][j]=false;
 90                  for(int k=0;k<=(1<<(2*(l-1)));k++)
 91                      vis[i][j][k]=false;
 92              }
 93           for(int i=0;i<l;i++)
 94               scanf("%d %d",&cur.bx[i],&cur.by[i]);
 95           scanf("%d",&s);
 96           for(int i=0;i<s;i++)
 97           {
 98               scanf("%d %d",&x,&y);
 99               map[x][y]=true;
100           }
101           printf("Case %d: %d\n",++T,bfs());
102     }
103     return 0;
104 }
View Code

 

posted @ 2013-07-23 01:00  诺小J  阅读(185)  评论(0编辑  收藏  举报