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 }

 

 

你可能感兴趣的:(2008)