#2 #3喜提Wrong Answer
#include<iostream>
#define int long long
using namespace std;
char a[10][10];
const int dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1};
int h()
{
int maxi=0;
for(int i=1;i<=4;i++)
{
int b=0,w=0;
for(int j=1;j<=4;j++)
{
if(a[i][j]=='B')b++;
if(a[i][j]=='W')w++;
}
maxi=max(maxi,max(b,w));
b=w=0;
for(int j=1;j<=4;j++)
{
if(a[j][i]=='B')b++;
if(a[j][i]=='W')w++;
}
maxi=max(maxi,max(b,w));
}
int b=0,w=0;
for(int i=1;i<=4;i++)
{
if(a[i][i]=='B')b++;
if(a[i][i]=='W')w++;
}
maxi=max(maxi,max(b,w));
b=w=0;
for(int i=1,j=4;i<=4;i++,j--)
{
if(a[i][j]=='B')b++;
if(a[i][j]=='W')w++;
}
return(4-max(maxi,max(b,w)))*2-1;
}
bool dfs(int d,int ld)
{
if(d>ld)
{
return h()==-1;
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(a[i][j]=='O')
{
for(int k=1;k<=4;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x<1||4<x||y<1||4<y)continue;
if(((d&1)&&a[x][y]=='B')||((d&1)==0&&a[x][y]=='W'))
{
swap(a[i][j],a[x][y]);
if(1)
{
if(dfs(d+1,ld))
{
swap(a[i][j],a[x][y]);
return 1;
}
}
swap(a[i][j],a[x][y]);
}
}
}
}
}
return 0;
}
bool dfs2(int d,int ld)
{
if(d>ld)
{
return h()==-1;
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(a[i][j]=='O')
{
for(int k=1;k<=4;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x<1||4<x||y<1||4<y)continue;
if(((d&1)&&a[x][y]=='W')||((d&1)==0&&a[x][y]=='B'))
{
swap(a[i][j],a[x][y]);
if(1)
{
if(dfs(d+1,ld))
{
swap(a[i][j],a[x][y]);
return 1;
}
}
swap(a[i][j],a[x][y]);
}
}
}
}
}
return 0;
}
inline void astar_iddfs()
{
int i=0,j=0;
for(;dfs(1,i)==0;i++);
for(;dfs2(1,j)==0;j++);
cout<<min(i,j);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)cin>>a[i][j];
astar_iddfs();
}