#include <bits/stdc++.h>
using namespace std;
int f[2][800][9], a[800][9], d[800][9], sz[800], w[800][4], tot, n;
map<multiset<int>, int> mp;
multiset<int> ss, sw[800];
void dfs(int d) {
  if (d == 9 || ss.size() == 4) {
    mp[ss] = tot;
    sz[tot] = ss.size();
    sw[tot] = ss;
    int t = 0;
    for (int i : ss) w[tot][t++] = i;
    ++tot;
    return;
  }
  ss.insert(d);
  dfs(d);
  ss.erase(ss.find(d));
  dfs(d + 1);
}
void upd(int &x, int y) { x = min(x, y); }
int main() {
  dfs(0);
  for (int i = 0; i < tot; i++) {
    for (int j = 0; j < 9; j++) {
      ss = sw[i];
      if (!sw[i].empty() && sw[i].find(j) != sw[i].end()) {
        ss.erase(ss.find(j));
        d[i][j] = mp[ss];
        ss.insert(j), ss.insert(j);
        a[i][j] = mp[ss];
      } else {
        ss.insert(j);
        a[i][j] = mp[ss];
      }
    }
  }
  scanf("%d", &n);
  memset(f, 0x3f, sizeof(f));
  f[0][tot - 1][0] = 0;
  for (int i = 0; i <= n; i++) {
    int now = i & 1, nxt = !now, s, t;
    if (i < n) scanf("%d%d", &s, &t), --s, --t;
    memset(f[nxt], 0x3f, sizeof(f[nxt]));
    for (int j = 0; j < tot; j++)
      for (int k = 0; k < 9; k++)
        if (f[now][j][k] < 1E9) {
          for (int l = 0; l < sz[j]; l++)
            upd(f[now][d[j][w[j][l]]][w[j][l]],
                f[now][j][k] + abs(w[j][l] - k));
          if (i < n && sz[j] < 4)
            upd(f[nxt][a[j][t]][s], f[now][j][k] + abs(k - s));
        }
  }
  int res = 1E9;
  for (int i = 0; i < 9; i++) upd(res, f[n & 1][tot - 1][i]);
  printf("%d\n", res + n * 2);
  return 0;
}
