项目编号:bzoj-1054

项目等级:Safe

项目描述:

  戳这里

特殊收容措施:

  直接状压BFS即可,我实现的比较渣。。复杂度O(45*216)。

附录:

 1 #include <bits/stdc++.h>
 2 #define range(i,c,o) for(register int i=(c);i<(o);++i)
 3 #define dange(i,c,o) for(register int i=(c);i>(o);--i)
 4 using namespace std;
 5  
 6 //#define __debug
 7 #ifdef __debug
 8     #define Function(type) type
 9     #define Procedure      void
10 #else
11     #define Function(type) __attribute__((optimize("-O2"))) inline type
12     #define Procedure      __attribute__((optimize("-O2"))) inline void
13 #endif
14  
15 Function(int) encode(bool map[4][4])
16 {
17     int ret=0;
18     range(i,0,4) range(j,0,4)
19     {
20         (ret<<=1)+=map[i][j];
21     }
22     return ret;
23 }
24 Procedure decode(
25     const int&status,bool map[4][4]
26 )
27 {
28     int S=status;
29     dange(i,3,-1) dange(j,3,-1)
30     {
31         map[i][j]=S&1,S>>=1;
32     }
33 }
34  
35 static const int dx[4]={ 1,-1, 0, 0};
36 static const int dy[4]={ 0, 0, 1,-1};
37 bool ST[4][4],ED[4][4],tmp[4][4];
38 queue< pair<int,int> > que;
39 bitset<65536> vis;
40 Procedure extend(
41     const int&x,const int&y,const int&s
42 )
43 {
44     range(i,0,4)
45     {
46         int tx=x+dx[i],ty=y+dy[i];
47         if(~tx&&~ty&&tx<4&&ty<4&&!tmp[tx][ty])
48         {
49             tmp[x][y]=0,tmp[tx][ty]=1;
50             int status=encode(tmp);
51             if(!vis.test(status))
52             {
53                 que.push(make_pair(status,s));
54                 vis.set(status);
55             }
56             tmp[x][y]=1,tmp[tx][ty]=0;
57         }
58     }
59 }
60 Function(int) BFS()
61 {
62     int init=encode(ST),zone=encode(ED);
63     que.push(make_pair(init,0));
64     vis.set(init);
65     for(;!que.empty();que.pop())
66     {
67         int status=que.front().first ,
68             steps =que.front().second;
69         if(status==zone) return steps;
70         decode(status,tmp);
71         range(i,0,4) range(j,0,4)
72         {
73             if(tmp[i][j]) extend(i,j,steps+1);
74         }
75     }
76 }
77  
78 int main()
79 {
80     range(i,0,4) range(j,0,4)
81     {
82         char c;
83         while(!isdigit(c=getchar()));
84         ST[i][j]=c-'0';
85     }
86     range(i,0,4) range(j,0,4)
87     {
88         char c;
89         while(!isdigit(c=getchar()));
90         ED[i][j]=c-'0';
91     }
92     return printf("%d\n",BFS()),0;
93 }
View Code