#include<bits/stdc++.h>
using namespace std;
struct cs {
int x,y;
};
char c;
int m[5][5];
int deep,ans;
cs o1,o2;
int fx[4][2]= {0,1,1,0,-1,0,0,-1};
bool f;
bool win() {
for(int i=1; i<=4; i++) {
if(m[i][1]==m[i][2]&&m[i][2]==m[i][3]&&m[i][3]==m[i][4]) {
return 1;
}
if(m[1][i]==m[2][i]&&m[2][i]==m[3][i]&&m[3][i]==m[4][i]) {
return 1;
}
}
if(m[1][1]==m[2][2]&&m[2][2]==m[3][3]&&m[3][3]==m[4][4]) {
return 1;
}
if(m[1][4]==m[2][3]&&m[2][3]==m[3][2]&&m[3][2]==m[4][1]) {
return 1;
}
return 0;
}
bool check(cs x,int bow) {
return (m[x.x][x.y]!=bow&&x.x>=1&&x.x<=4&&x.y>=1&&x.y<=4);
}
void iddfs(cs a,cs b,int bow,int d) {
cs x,y;
if(win()) {
f=1;
return;
} else if(d>deep) {
return;
}
for(int i=0; i<4; i++) {
x.x=a.x+fx[i][0];
x.y=a.y+fx[i][1];
y.x=b.x+fx[i][0];
y.y=b.y+fx[i][1];
if(check(x,bow)) {
swap(m[a.x][a.y],m[x.x][x.y]);
iddfs(x,b,m[a.x][a.y],d+1);
swap(m[a.x][a.y],m[x.x][x.y]);
}
if(check(y,bow)) {
swap(m[b.x][b.y],m[y.x][y.y]);
iddfs(a,y,m[b.x][b.y],d+1);
swap(m[b.x][b.y],m[y.x][y.y]);
}
}
}
int main() {
for(int i=1; i<=4; i++) {
for(int j=1; j<=4; j++) {
cin>>c;
if(c=='B') {
m[i][j]=1;
} else if(c=='W') {
m[i][j]=2;
} else {
m[i][j]=3;
if(o1.x==0) {
o1.x=i;
o1.y=j;
} else {
o2.x=i;
o2.y=j;
}
}
}
}
for(deep=0;; deep++) {
iddfs(o1,o2,1,1);
iddfs(o1,o2,2,1);
if(f) {
cout<<deep;
break;
}
}
return 0;
}