1 #include <cstdio>
2
3 char map[6][6];
4 int ans,x1,x2,y1,y2;
5 int fx[4]={0,1,0,-1};
6 int fy[4]={1,0,-1,0};
7
8 #define swap(a,b) {char tmp=a;a=b;b=tmp;}
9
10 bool judge()
11 {
12 for(int i=1; i<5; i++)
13 {
14 if(map[i][1]==map[i][2]&&map[i][1]==map[i][3]&&map[i][1]==map[i][4]) return 1;
15 if(map[1][i]==map[2][i]&&map[1][i]==map[3][i]&&map[1][i]==map[4][i]) return 1;
16 }
17 if(map[1][1]==map[2][2]&&map[1][1]==map[3][3]&&map[1][1]==map[4][4]) return 1;
18 if(map[4][1]==map[3][2]&&map[4][1]==map[2][3]&&map[4][1]==map[1][4]) return 1;
19 return false;
20 }
21 bool DFS(int nx1,int ny1,int nx2,int ny2,char pre,int step)
22 {
23 if(step>=ans) return judge();
24 int tx1,tx2,ty1,ty2;
25 for(int i=0; i<4; ++i)
26 {
27 tx1=nx1+fx[i],ty1=ny1+fy[i];
28 tx2=nx2+fx[i],ty2=ny2+fy[i];
29 if(tx1>0&&tx1<5&&ty1>0&&ty1<5&&map[tx1][ty1]!=pre)
30 {
31 swap(map[nx1][ny1],map[tx1][ty1]);
32 if(DFS(tx1,ty1,nx2,ny2,(pre==‘W‘?‘B‘:‘W‘),step+1)) return 1;
33 swap(map[nx1][ny1],map[tx1][ty1]);
34 }
35 if(tx2>0&&tx2<5&&ty2>0&&ty2<5&&map[tx2][ty2]!=pre)
36 {
37 swap(map[nx2][ny2],map[tx2][ty2]);
38 if(DFS(nx1,ny1,tx2,ty2,(pre==‘W‘?‘B‘:‘W‘),step+1)) return 1;
39 swap(map[nx2][ny2],map[tx2][ty2]);
40 }
41 }
42 return 0;
43 }
44
45 int AC()
46 {
47 for(int i=1; i<5; ++i)
48 {
49 scanf("%s",map[i]+1);
50 for(int j=1; j<5; ++j)
51 if(map[i][j]==‘O‘)
52 if(!x1) x1=i,y1=j;
53 else x2=i,y2=j;
54 }
55 for(ans=1; ans<1e7; ++ans)
56 {
57 if(DFS(x1,y1,x2,y2,‘W‘,0)) break;
58 if(DFS(x1,y1,x2,y2,‘B‘,0)) break;
59 }
60 printf("%d\n",ans);
61 return 0;
62 }
63
64 int Aptal=AC();
65 int main(){;}