#include #include #include #include #include using namespace std; struct Num { short a, b; Num() : a(-1), b(-1) {} Num(int aa, int bb) : a(aa), b(bb) {} Num next() const { return Num(a, b+1); } Num prev() const { return Num(a, b-1); } bool hasNext() const { return b > 0 && b < 7; } int getIndex() const { return (a-1) * 8 + (b-1); } bool check() const { return 1 <= a && a <= 4 && 1 <= b && b <= 8; } bool operator <(const Num& n) const { if(a != n.a) return a < n.a; return b < n.b; } bool operator ==(const Num& n) const { return a == n.a && b == n.b; } }; typedef Num Pos; struct State { vector pos; vector num; vector gap; State() : pos(4*8), num(4*8), gap(0) { } bool operator <(const State& s) const { return pos < s.pos; } void Print() { for(int i = 1; i <=4; ++i) { for(int j = 1; j <=8; ++j) { Num n = pos[Num(i,j).getIndex()]; if(n.a < 0) cout << " "; else cout << n.a << n.b << " "; } cout << endl; } } }; vector end_pos; int Search(State init) { multimap up; set cache; cache.insert(init); up.insert(make_pair(0, init)); while(!up.empty()) { int cnt = up.begin()->first; State s = up.begin()->second; up.erase(up.begin()); if(s.pos == end_pos) return cnt; for(int i = 0; i < 4; ++i) { State cp = s; Pos p1 = cp.gap[i]; Num np = cp.pos[p1.prev().getIndex()]; if(!np.hasNext()) continue; Num n = np.next(); Pos p2 = cp.num[n.getIndex()]; cp.gap[i] = p2; cp.num[n.getIndex()] = p1; cp.pos[p1.getIndex()] = n; cp.pos[p2.getIndex()] = Num(); if(cache.insert(cp).second) up.insert(make_pair(cnt+1, cp)); } } return -1; } int main() { for(int i = 1; i <= 4; ++i) { for(int j = 1; j <= 7; ++j) { end_pos.push_back(Num(i, j)); } end_pos.push_back(Num()); } int nnn; cin >> nnn; for(int iii = 0; iii < nnn; ++iii) { State init; for(int i = 1; i <= 4; ++i) for(int j = 2; j <= 8; ++j) { int v; cin >> v; Num n(v/10, v%10); Num p(i, j); if(n.b == 1) { Num g(n.a, 1); init.pos[p.getIndex()] = Num(); init.num[n.getIndex()] = p; init.pos[g.getIndex()] = n; init.gap.push_back(p); } else { init.pos[p.getIndex()] = n; init.num[n.getIndex()] = p; } } cout << Search(init) << endl; } }