POJ 1324

  1 //Result:wizmann    1324    Accepted    3112K    3454MS    G++    3200B
  2 //What's Wrong:
  3 //    1.位压缩的效率,减少无关位
  4 //    2.蛇的走动方向没有经过检测
  5 //    3.没有自己出数据检验
  6 //    4.对于某些数据相当然了
  7 #include <cstdio>
  8 #include <cstdlib>
  9 #include <cstring>
 10 #include <algorithm>
 11 #include <iostream>
 12 #include <queue>
 13 #include <bitset>
 14 
 15 using namespace std;
 16 
 17 #define SIZE 21
 18 #define INF 1<<25
 19 #define STATUS 1<<14
 20 #define print(x) cout<<x<<endl
 21 
 22 const int mx[]={0,1,0,-1};
 23 const int my[]={-1,0,1,0};
 24 int n,m,l;
 25 
 26 struct point
 27 {
 28     int x,y;
 29     point(){}
 30     point(int i_x,int i_y)
 31     {
 32         x=i_x;y=i_y;
 33     }
 34 };
 35 
 36 struct snake
 37 {
 38     point head;
 39     int status;
 40     int step;
 41 
 42     snake()
 43     {
 44         status=0;
 45         step=0;
 46     }
 47     
 48     void makeStatus(point *body)
 49     {
 50         status=0;
 51         int ptr=0;
 52         for(int i=1;i<l;i++)
 53         {
 54             int now=i;
 55             int pre=i-1;
 56             int dir=-1;
 57             for(int i=0;i<4;i++)
 58             {
 59                 if(body[pre].x-body[now].x==mx[i] &&
 60                     body[pre].y-body[now].y==my[i])
 61                 {
 62                     dir=i;
 63                     break;
 64                 }
 65             }
 66             //print("DIR:"<<dir);
 67             status |= (dir<<ptr);
 68             //print(status);
 69             ptr+=2;
 70         }
 71     }
 72 };
 73 
 74 point stone[SIZE*SIZE];
 75 queue<snake> q;
 76 bitset<STATUS> visit[SIZE][SIZE];
 77 //char visit[SIZE][SIZE][STATUS];
 78 int stone_num;
 79 
 80 inline bool inMap(int x,int y)
 81 {
 82     if(x>0 && x<=m && y>0 && y<=n) return true;
 83     else return false;
 84 }
 85 
 86 int moveSnake(int x,int y,snake& py)
 87 {
 88     for(int i=0;i<stone_num;i++)
 89     {
 90         if(x==stone[i].x && y==stone[i].y) return -1;
 91     }
 92     int status=0;
 93     point now=py.head;
 94     point head=point(x,y);
 95     int ptr=0;
 96     for(int i=0;i<l;i++)
 97     {
 98         int dir;
 99         if(now.x==x && now.y==y) return -1;
100         else
101         {
102             //print(now.x<<' '<<now.y);
103             for(int j=0;j<4;j++)
104             {
105                 if(head.x-now.x==mx[j] && head.y-now.y==my[j])
106                 {
107                     dir=j;
108                     break;
109                 }
110             }
111             if(i<l-1)
112             {
113                 status |= (dir<<ptr);
114                 dir=( (3<<ptr) & py.status )>>ptr;
115                 //print("DIR:"<<dir);
116                 ptr+=2;
117                 head=now;
118                 now.x-=mx[dir];
119                 now.y-=my[dir];
120             }
121         }
122     }
123     py.head=point(x,y);
124     py.status=status;
125     py.step++;
126     //puts("");
127     return py.status;
128 }
129 
130 int bfs()
131 {
132     int ans=INF;
133     while(!q.empty())
134     {
135         snake now=q.front();
136         q.pop();
137         int now_x=now.head.x;
138         int now_y=now.head.y;
139         //print(now_x<<' '<<now_y);
140         if(now.step>=ans || visit[now_y][now_x][now.status]) continue;
141         if(now_x==1 && now_y==1)
142         {
143             ans=now.step;
144             continue;
145         }
146         visit[now_y][now_x][now.status]=1;
147         
148         point head=now.head;
149 
150         for(int i=0;i<4;i++)
151         {
152             int nx=head.x+mx[i];
153             int ny=head.y+my[i];
154             if(!inMap(nx,ny)) continue;
155             snake npy=now;
156             int nstatus=moveSnake(nx,ny,npy);
157             //print(nstatus);
158             if(nstatus==-1) continue;
159             else q.push(npy);
160         }
161     }
162     return ans;
163 }
164 
165 
166 int main()
167 {
168     int cas=1;
169     point body[10];
170     while(scanf("%d%d%d",&n,&m,&l)!=EOF && n+m+l)
171     {
172         snake py;
173         int a,b;
174         for(int i=0;i<SIZE;i++)
175         {
176             for(int j=0;j<SIZE;j++)
177             {
178                 visit[i][j].reset();
179             }
180         }
181         while(!q.empty()) q.pop();
182         
183         for(int i=0;i<l;i++)
184         {
185             scanf("%d%d",&a,&b);
186             body[i]=point(b,a);
187         }
188         py.head=body[0];
189         py.makeStatus(body);
190         py.step=0;
191         q.push(py);
192         
193         scanf("%d",&stone_num);
194         for(int i=0;i<stone_num;i++)
195         {
196             scanf("%d%d",&a,&b);
197             stone[i]=point(b,a);
198         }
199         int ans=bfs();
200         if(ans>=INF) ans=-1;
201         
202         printf("Case %d: %d\n",cas++,ans);
203     }
204     return 0;
205 }

posted on 2012-04-11 00:48  Wizmann  阅读(524)  评论(0)    收藏  举报

导航