BZOJ 1054 [HAOI2008]移动玩具 BFS

双向bfs。

尼玛,比单向都慢。。。抑郁。。

 

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstdio>
 6 
 7 #define N 77777
 8 #define INF 0x3f3f3f3f
 9 
10 using namespace std;
11 
12 int n,st,ed;
13 int map[5][5];
14 int q[2][N];
15 int sp[2][N];
16 int dx[4]={-1,0,1,0};
17 int dy[4]={0,1,0,-1};
18 
19 inline int pack(int a[5][5])
20 {
21     int rt=0;
22     for(int i=0;i<4;i++)
23         for(int j=0;j<4;j++)
24             if(a[i][j]) rt|=1<<(i*4+j);
25     return rt;
26 }
27 
28 inline void unpack(int a[5][5],int zt)
29 {
30     for(int i=0;i<4;i++)
31         for(int j=0;j<4;j++)
32         {
33             if(zt&(1<<(i*4+j))) a[i][j]=true;
34             else a[i][j]=0;
35         }
36 }
37 
38 inline void read()
39 {
40     memset(sp,0x3f,sizeof sp);
41     char str[10];
42     for(int i=0;i<4;i++)
43     {
44         scanf("%s",str);
45         for(int j=0;j<4;j++)
46             map[i][j]=str[j]-'0';
47     }
48     st=pack(map);
49     for(int i=0;i<4;i++)
50     {
51         scanf("%s",str);
52         for(int j=0;j<4;j++)
53             map[i][j]=str[j]-'0',ed|=map[i][j]<<(i*4+j);
54     }
55     ed=pack(map);
56 }
57 
58 inline void go()
59 {
60     if(st==ed) {puts("0");return;}
61     int h[2]={1,1},t[2]={1,1};
62     q[0][t[0]++]=st; q[1][t[1]++]=ed;
63     sp[0][st]=0; sp[1][ed]=0;
64     int fg=0;
65     while(1)
66     {
67         int step=sp[fg][q[fg][h[fg]]],sta,nx,ny,zt;
68         while(h[fg]<t[fg]&&sp[fg][q[fg][h[fg]]]==step)
69         {
70             sta=q[fg][h[fg]++];
71             unpack(map,sta);
72             for(int i=0;i<4;i++)
73                 for(int j=0;j<4;j++)
74                 {
75                     if(!map[i][j]) continue;
76                     for(int k=0;k<4;k++)
77                     {
78                         nx=i+dx[k]; ny=j+dy[k];
79                         if(nx<0||ny<0||nx>=4||ny>=4||map[nx][ny]) continue;
80                         swap(map[i][j],map[nx][ny]);
81                         zt=pack(map);
82                         swap(map[i][j],map[nx][ny]);
83                         if(sp[fg][zt]<=sp[fg][sta]+1) continue;
84                         if(sp[!fg][zt]!=INF) {printf("%d\n",sp[fg][sta]+sp[!fg][zt]+1);return;}
85                         q[fg][t[fg]++]=zt; sp[fg][zt]=sp[fg][sta]+1;
86                     }
87                 }
88         }
89         fg=!fg;
90     }
91 }
92 
93 int main()
94 {
95     read(),go();
96     return 0;
97 }

 

 

posted @ 2013-03-12 23:57  proverbs  阅读(552)  评论(0编辑  收藏  举报