#include<iostream>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
map<int,int> be_m;
map<int,int> fi_m;
int state,ans;
queue<int> be_q;queue<int> fi_q;
int xx[4]={0,-1,1,0},yy[4]={-1,0,0,1};
bool check(int x,int y){
if(x>3||x<1||y>3||y<1)return false;
return true;
}
int deal(int arr[][4]){
int re=0;
for(int i=3;i>0;i--){
for(int j=3;j>0;j--){
re=re*10+arr[i][j];
}
}
return re;
}
int main(){
cin>>state;
be_m[state]=0;
be_q.push(state);
fi_q.push(123804765);
fi_m[123804765]=0;
bool flag=1;
while(1){
if(be_q.size()<fi_q.size()){
int be_sta=be_q.front();
be_q.pop();
int tmp=be_sta;
if(fi_m.find(be_sta)!=fi_m.end()){
ans=fi_m[be_sta]+be_m[be_sta];
break;
}
int arr[4][4];int x,y;
for(int i=3;i>0;i--){
for(int j=3;j>0;j--){
arr[i][j]=tmp%10;
tmp/=10;
if(!arr[i][j])x=i,y=j;
}
}
for(int i=0;i<4;i++){
int x1=x+xx[i],y1=y+yy[i];
if(check(x1,y1)){
swap(arr[x][y],arr[x1][y1]);
int re=deal(arr);
if(be_m.find(re)==be_m.end()){
be_m[re]=be_m[be_sta]+1;
be_q.push(re);
}
swap(arr[x][y],arr[x1][y1]);
}
}
}
else{
int x,y; int tmp,arr[4][4];
int fi_sta=fi_q.front();
fi_q.pop();
if(be_m.find(fi_sta)!=be_m.end()){
ans=be_m[fi_sta]+fi_m[fi_sta];
break;
}
tmp=fi_sta;
for(int i=3;i>0;i--){
for(int j=3;j>0;j--){
arr[i][j]=tmp%10;
tmp/=10;
if(!arr[i][j])x=i,y=j;
}
}
for(int i=0;i<4;i++){
int x1=x+xx[i],y1=y+yy[i];
if(check(x1,y1)){
swap(arr[x][y],arr[x1][y1]);
int re=deal(arr);
if(fi_m.find(re)==fi_m.end()){
fi_m[re]=fi_m[fi_sta]+1;
fi_q.push(re);
}
swap(arr[x][y],arr[x1][y1]);
}
}
}
}
cout<<ans;
}