1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 const int MAXN=10;
5 int map[MAXN][MAXN];
6 int vis[MAXN][MAXN][MAXN][MAXN];
7 int kong1x,kong1y;
8 int kong2x,kong2y;
9 int hang[MAXN];// 储存每一行有多少个黑棋子
10 int lie[MAXN];
11 int leftdjx;//左对角线
12 int rightdjx;// 右对角线
13 int ans=0x7fffffff;
14 int xx[5]={-1,+1,0,0};
15 int yy[5]={0,0,-1,+1};
16 int how;// 1表示应该走黑棋 2表示白棋
17 void dfs(int k1x,int k1y,int k2x,int k2y,int step)
18 {
19 for(int i=1;i<=4;i++)
20 {
21 if(leftdjx==4||rightdjx==4||hang[i]==4||(hang[i]==0&&k1x!=i&&k2x!=i)||lie[i]==4||(lie[i]==0&&k1y!=i&&k2y!=i))
22 {
23 if(step<ans)
24 ans=step;
25 return ;
26 }
27 }
28 if(step>ans)
29 return;
30 for(int i=0;i<4;i++)
31 {
32 int flag=0;
33 int wx=k1x+xx[i];
34 int wy=k1y+yy[i];
35 if(((map[wx][wy]==how)||how==2)&&wx<=4&&wx>=1&&wy<=4&&wy>=1&&map[wx][wy]!=2&&vis[k1x][k1y][wx][wy]==0)
36 {
37 if(map[wx][wy]==1)
38 how=0;
39 else if(map[wx][wy]==0)
40 how=1;
41 if(map[wx][wy]==1)
42 {
43 hang[k1x]++;
44 hang[wx]--;
45 lie[k1y]++;
46 lie[wy]--;
47 if(k1x==k1y)
48 leftdjx++;
49 if(k1x+k1y==5)
50 rightdjx++;
51 flag=1;
52 if(wx==wy)
53 leftdjx--;
54 if(wx+wy==5)
55 rightdjx--;
56 }
57 vis[k1x][k1y][wx][wy]=1;
58 map[k1x][k1y]=map[wx][wy];
59 map[wx][wy]=2;
60 dfs(wx,wy,k2x,k2y,step+1);
61 /*if(map[wx][wy]==1)
62 how=0;
63 else if(map[wx][wy]==0)
64 how=1;*/
65 vis[k1x][k1y][wx][wy]=0;
66 map[wx][wy]=map[k1x][k1y];
67 map[k1x][k1y]=2;
68 if(flag==1)
69 {
70 hang[k1x]--;
71 hang[wx]++;
72 lie[k1y]--;
73 lie[wy]++;
74 if(k1x==k1y)
75 leftdjx--;
76 if(k1x+k1y==5)
77 rightdjx--;
78 if(wx==wy)
79 leftdjx++;
80 if(wx+wy==5)
81 rightdjx++;
82 }
83 }
84 }
85 for(int i=0;i<4;i++)
86 {
87 int flag=0;
88 int wx=k2x+xx[i];
89 int wy=k2y+yy[i];
90 if(((map[wx][wy]==how)||how==2)&&wx<=4&&wx>=1&&wy<=4&&wy>=1&&map[wx][wy]!=2&&vis[k2x][k2y][wx][wy]==0)
91 {
92 if(map[wx][wy]==1)
93 how=0;
94 else if(map[wx][wy]==0)
95 how=1;
96 if(map[wx][wy]==1)
97 {
98 hang[k2x]++;
99 hang[wx]--;
100 lie[k2y]++;
101 lie[wy]--;
102 if(k2x==k2y)
103 leftdjx++;
104 if(k2x+k2y==5)
105 rightdjx++;
106 flag=1;
107 if(wx==wy)
108 leftdjx--;
109 if(wx+wy==5)
110 rightdjx--;
111 }
112 vis[k2x][k2y][wx][wy]=1;
113 map[k2x][k2y]=map[wx][wy];
114 map[wx][wy]=2;
115 dfs(k1x,k1y,wx,wy,step+1);
116 /*if(map[wx][wy]==1)
117 how=0;
118 else if(map[wx][wy]==0)
119 how=1;*/
120 vis[k2x][k2y][wx][wy]=0;
121 map[wx][wy]=map[k2x][k2y];
122 map[k2x][k2y]=2;
123 if(flag==1)
124 {
125 hang[k2x]--;
126 hang[wx]++;
127 lie[k2y]--;
128 lie[wy]++;
129 if(k2x==k2y)
130 leftdjx--;
131 if(k2x+k2y==5)
132 rightdjx--;
133 if(wx==wy)
134 leftdjx++;
135 if(wx+wy==5)
136 rightdjx++;
137 }
138 }
139 }
140 }
141 int main()
142 {
143 for(int i=1;i<=4;i++)
144 {
145 for(int j=1;j<=4;j++)
146 {
147 char c;
148 cin>>c;
149 if(c=='B')
150 {
151 map[i][j]=1;// 黑色棋子
152 hang[i]++;
153 lie[j]++;
154 if(i==j)leftdjx++;
155 if(i+j==5)rightdjx++;
156 }
157 else if(c=='W')
158 {
159 map[i][j]=0;//白色棋子
160 }
161 else
162 {
163 map[i][j]=2;
164 if(kong1x==0&&kong1y==0)
165 {
166 kong1x=i;
167 kong1y=j;
168 }
169 else
170 {
171 kong2x=i;
172 kong2y=j;
173 }
174 }
175 }
176 }
177 how=2;
178 dfs(kong1x,kong1y,kong2x,kong2y,0);
179 printf("%d",ans);
180 return 0;
181 }