#include<set>
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dx[4]{0,0,-1,1},dy[4]{-1,1,0,0};
struct matrix
{
int board[3][3];
bool friend operator<(matrix a,matrix b)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(a.board[i][j]!=b.board[i][j])
return a.board[i][j]<b.board[i][j];
return false;
}
};
matrix st,target;
int H(matrix a)
{
int ans{};
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(a.board[i][j]!=target.board[i][j])ans++;
return ans;
}
struct node
{
int time;matrix status;
bool friend operator<(node a,node b){return H(a.status)+a.time>H(b.status)+b.time;}
};
set<matrix>vis;
priority_queue<node>q;
inline bool check(int a,int b){return (a>=0&&a<3&&b>=0&&b<3);}
int main()
{
target.board[0][0]=1,target.board[0][1]=2,target.board[0][2]=3;
target.board[1][0]=8,target.board[1][1]=0,target.board[1][2]=4;
target.board[2][0]=7,target.board[2][1]=6,target.board[2][2]=5;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
char ch=getchar();
st.board[i][j]=ch-'0';
}
q.push(node{0,st}),vis.insert(st);
while(!q.empty())
{
node now=q.top();q.pop();
if(!H(now.status)){cout<<now.time<<endl;break;}
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
{
int xx=i+dx[k],yy=j+dy[k];
if(check(xx,yy)&&(now.status.board[xx][yy]==0))
{
swap(now.status.board[i][j],now.status.board[xx][yy]);
if(!vis.count(now.status))
q.push(node{now.time+1,now.status}),vis.insert(now.status);
swap(now.status.board[i][j],now.status.board[xx][yy]);
}
}
}
}