//棋盘游戏 大致思路:将每一个棋盘存储为一个16位 的二进制数,将中间过程的棋盘状态记为state,
//什么时候 start==end 就返回dis[state],即最小步数
//本题对位运算的要求比较高,枚举时就是将不同地方的棋子进行交换
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
//2^16=65536
const int N=65536;
int dist[N],a,b;//state存储不同的棋盘状态
int input()
{
int state=0;
for(int i=0;i<16;i++)
{
char c;
cin>>c;
if(c=='1') state+=1<<i;
}
return state;
//将棋盘状态转换为一个16位的二进制表示
}
void swap(int &state,int x, int y)
{
//将x y位 两个位置的棋子状态换一下
int a=state>>x&1,b=state>>y&1;//a b 表示 这两个位置处放置的棋子
state-=a<<x,state-=b<<y;
state+=a<<y,state+=b<<x;//x位置 -a x位置 +b
}
int bfs(int start, int ed)
{
queue<int >q;
memset(dist,-1,sizeof(dist));
dist[start]=0;
q.push(start);
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};//定义方向数组
while(!q.empty())
{
int t=q.front();
q.pop();
//开始交换棋子
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
int x=i+dx[k],y=j+dy[k];
//判断 x,y位置是否合法
if(x>=0&&x<4&&y>=0&&y<4)
{
int state=t;
swap(state,i*4+j,x*4+y);
if(dist[state]==-1)
{
//等于-1说明这个状态没被遍历过
dist[state]=dist[t]+1;
if(state==ed) return dist[state];
q.push(state);
}
}
}
}
}
}
return 0;
}
int main()
{
int a=input();
int b=input();// 初始、最终两棋盘的状态
cout<<bfs(a,b)<<endl;
return 0;
}