#include #include #include using namespace std; int getNum(int x, int y) { if (x < 0 || y < 0 || x >= 3 || y >= 4 || x+y >= 5) return -1; if (y == 3) return 0; return 7 - 3*y + x; } int encode(int x1, int y1, int x2, int y2, int pos) { return x1 + y1*5 + x2*25 + y2*125 + pos*625; } void decode(int code, int &x1, int &y1, int &x2, int &y2, int &pos) { x1 = code%5; y1 = (code/5)%5; x2 = (code/25)%5; y2 = (code/125)%5; pos = code/625; } int main() { string goal; while (cin >> goal) { if (goal == "eof") return 0; int pos = encode(0, 1, 1, 1, 0), qpos = 0; vector q(1, pos); vector dist(5*5*5*5*101, 10000); dist[pos] = 0; while (qpos < q.size()) { int x1, y1, x2, y2, pos, d = dist[q[qpos]]; decode(q[qpos++], x1, y1, x2, y2, pos); if (pos >= goal.size()) { cout << d << endl; break; } for (int dx1 = -1; dx1 <= 1; dx1++) for (int dy1 = -1; dy1 <= 1; dy1++) for (int dx2 = -1; dx2 <= 1; dx2++) for (int dy2 = -1; dy2 <= 1; dy2++) for (int press = -1; press < 2; press++) if (dx1*dx1 + dy1*dy1 <= 1 && dx2*dx2 + dy2*dy2 <= 1) if (press != 0 || dx1*dx1 + dy1*dy1 == 0) if (press != 1 || dx2*dx2 + dy2*dy2 == 0) { int npos = pos; int nx1 = x1 + dx1, ny1 = y1 + dy1; int nx2 = x2 + dx2, ny2 = y2 + dy2; if (nx1 >= nx2) continue; if (getNum(nx1, ny1) < 0 || getNum(nx2, ny2) < 0) continue; if (press == 0) if (getNum(nx1, ny1)+'0' == goal[pos]) npos++; else continue; else if (press == 1) if (getNum(nx2, ny2)+'0' == goal[pos]) npos++; else continue; int code2 = encode(nx1, ny1, nx2, ny2, npos); if (dist[code2] > d+1) { dist[code2] = d+1; q.push_back(code2); } } } } }