#include<cstdio>
#include<queue>
#include<map>
using namespace std;
char arr[10], brr[10]="123804765";
struct node {
int num, step, cost, zeroPos;
bool operator<(const node& a)const{return cost > a.cost;}node(int n, int s, int p){
num = n, step = s, zeroPos = p;setCost();}voidsetCost(){
char a[10];
int c =0;sprintf(a,"%09d", num);for(int i =0; i <9; i++)if(a[i]!= brr[i])
c++;
cost = c + step;}};
int des =123804765;
int changeId[9][4]={{-1,-1,3,1},{-1,0,4,2},{-1,1,5,-1},{0,-1,6,4},{1,3,7,5},{2,4,8,-1},{3,-1,-1,7},{4,6,-1,8},{5,7,-1,-1}};
map<int, bool>mymap;
priority_queue<node> que;voidswap(char* ch, int a, int b){ char c = ch[a]; ch[a]= ch[b]; ch[b]= c;}
int bfsHash(int start, int zeroPos){
char temp[10];
node tempN(start,0, zeroPos);
que.push(tempN);
mymap[start]=1;while(!que.empty()){
tempN = que.top();
que.pop();sprintf(temp,"%09d", tempN.num);
int pos = tempN.zeroPos, k;for(int i =0; i <4; i++){if(changeId[pos][i]!=-1){swap(temp, pos, changeId[pos][i]);sscanf(temp,"%d",&k);if(k == des)return tempN.step +1;if(mymap.count(k)==0){
node tempM(k, tempN.step +1, changeId[pos][i]);
que.push(tempM);
mymap[k]=1;}swap(temp, pos, changeId[pos][i]);}}}}
int main(){
int n, k, b;scanf("%s", arr);for(k =0; k <9; k++)if(arr[k]=='0')break;sscanf(arr,"%d",&n);
b =bfsHash(n, k);printf("%d步即可变换完成", b);return0;}