#include<iostream>
#include<cmath>
#include<string>
#include<map>
#include<queue>

using namespace std;

#define N 3
#define M 9
#define O 4

struct Puzzle{
  int f[M];
  int space;
  string path;

  bool operator < ( const Puzzle &p ) const {
    for(int i = 0;i < M;i++){
      if(f[i] == p.f[i]) continue;
      return f[i] > p.f[i];
    }
    return false;
  }
};

static const int dx[O] = {-1, 0, 1, 0};
static const int dy[O] = {0, -1, 0, 1};
static const int dir[O] = {'u', 'l', 'd', 'r'};

bool isTarget (Puzzle p){
  int i;
  for(i = 0;i < M;i++)
    if(p.f[i] != (i + 1)) return false;
  return true;
}

string bfs(Puzzle s){
  queue<Puzzle> Q;
  map<Puzzle, bool> V;
  Puzzle u,v;
  s.path = "";
  Q.push(s);
  V[s] = true;

  while(!Q.empty()){
    u = Q.front();
    Q.pop();
    if(isTarget(u))return u.path;
    int sx = u.space / N;
    int sy = u.space % N;
    for(int r = 0;r < O;r++){
      int tx = sx + dx[r];
      int ty = sy + dy[r];
      if(tx < 0 ||ty < 0 ||tx >= N ||ty >= N)continue;
      v = u;
      swap(v.f[u.space], v.f[tx * N + ty]);
      v.space = tx * N + ty;
      if( !V[v]){
        V[v] = true;
        v.path += dir[r];
        Q.push(v);
      }
    }
  }
  return "unsolvable";
}

int main(){
  Puzzle in;
  int i;

  for(i = 0;i < M;i++){
    cin >> in.f[i];
    if(in.f[i] == 0){
      in.f[i] = M;
      in.space = i;
    }
  }

  string ans = bfs(in);
  cout << ans.size() << endl;

  return 0;
}

