#include #include #include using namespace std; struct State { int table[4][8]; int move; State() { move = 0; } bool operator < (const State& p) const { if (this->move != p.move) { return this->move < p.move; } for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { if (this->table[i][j] != p.table[i][j]) { return this->table[i][j] < p.table[i][j]; } } } return false; } bool ok() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 7; j++) { if (table[i][j] != (i + 1) * 10 + (j + 1)) { return false; } } } return true; } void print() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { cout << table[i][j] << " "; } cout <table[i][j] == 11) { swap(s->table[i][j], s->table[0][0]); } if (s->table[i][j] == 21) { swap(s->table[i][j], s->table[1][0]); } if (s->table[i][j] == 31) { swap(s->table[i][j], s->table[2][0]); } if (s->table[i][j] == 41) { swap(s->table[i][j], s->table[3][0]); } } } } int main() { int loop; cin >> loop; while (loop--) { State start; for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { if (j == 0) { start.table[i][j] = 0; } else { cin >> start.table[i][j]; } } } set Q; set cache; first_move(&start); Q.insert(start); // cache.insert(start); if (start.ok()) { cout << "0" << endl; continue; } int ans = -1; while (!Q.empty()) { /* for (set::iterator itr = Q.begin(); itr != Q.end(); itr++) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { cout << itr->table[i][j] << " "; } cout << endl; } cout << endl; }*/ State s = *Q.begin(); Q.erase(s); if (s.ok()) { ans = s.move; break; } // cout << "s.move " << s.move << endl; for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { if (s.table[i][j] != 0) { continue; } int left = s.table[i][j - 1]; for (int k = 0; k < 4 ; k++) { for (int l = 0; l < 8; l++) { if (s.table[k][l] != left + 1) { continue; } State next = s; swap(next.table[i][j], next.table[k][l]); next.move++; if (cache.find(next) != cache.end()) { continue; } cache.insert(next); Q.insert(next); } } } } } cout << ans << endl; } return 0; }