#include<iostream>
#include<queue>
#include<map>
using namespace std;
queue<int>q1;
map<int,int>step;
int bs[3][3];
void isdate();
int bfs();
void init();
int canmove(int u,int dire);
int mov(int u,int dire);
int bsdate;
int dr[4]={0,1,0,-1};
int dc[4]={-1,0,1,0};
int main()
{
int num;
isdate();
init();
num=bfs();
cout<<num<<endl;
}
void isdate()
{
int i,j;
bsdate=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
cin>>bs[i][j];
bsdate=bsdate*10+bs[i][j];
}
}
}
void init()
{
q1.push(bsdate);
step[bsdate]=0;
}
int bfs()
{
int u,v,i;
while(!q1.empty())
{
u=q1.front();
q1.pop();
if(u==123456780)
{
return step[u];
}
else
{
for(i=0;i<4;i++)
{
if(canmove(u,i))
{
v=mov(u,i);
if(v==123456780)
{
return (step[u]+1);
}
if(step.count(v)==0)
{
q1.push(v);
step[v]=step[u]+1;
}
}
}
}
}
return -1;
}
int canmove(int u,int dire)
{
int i,j;
int drow,dcol;
int now[3][3];
int r,c;
for(i=2;i>=0;i--)
{
for(j=2;j>=0;j--)
{
now[i][j]=u%10;
u=u/10;
if(now[i][j]==0)
{
drow=i;
dcol=j;
}
}
}
r=drow+dr[dire];
c=dcol+dc[dire];
if(r>=0&&r<3&&c>=0&&c<3)
{
return 1;
}
else
{
return 0;
}
}
int mov(int u,int dire)
{
int i,j;
int now[3][3];
int drow,dcol;
int r,c,sum;
sum=0;
for(i=2;i>=0;i--)
{
for(j=2;j>=0;j--)
{
now[i][j]=u%10;
u=u/10;
if(now[i][j]==0)
{
drow=i;
dcol=j;
}
}
}
r=drow+dr[dire];
c=dcol+dc[dire];
now[drow][dcol]=now[r][c];
now[r][c]=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
sum=sum*10+now[i][j];
}
}
return sum;
}