#include #include #include #include #include #include using namespace std; vector adj[20]; void SetAdj(int i, int x, int y) { if(0 <= x && x < 4 && 0 <= y && y < 5) { int j = x + y * 4; if(j > i) adj[i].push_back(j); } } void MakeAdj() { for(int x = 0; x < 4; ++x) for(int y = 0; y < 5; ++y) for(int dx = -1; dx < 2; ++dx) for(int dy = -1; dy < 2; ++dy) if(dx || dy) SetAdj(x + y*4, x+dx, y+dy); } void Remove(list& l, int k) { list::iterator i = l.begin(); for(int j = 0; j < k; ++j) ++i; l.erase(i); } int Search(list& init) { int r = 20; set > cache; set > up; up.insert(init); while(!up.empty()) { list s = *up.begin(); up.erase(up.begin()); r = min(r, (int)s.size()); if(r == 0) return 0; vector val(s.begin(), s.end()); //for(int i = 0; i < (int)val.size(); ++i) //cout << val[i]; for(int i = 0; i < (int)s.size(); ++i) { vector& a = adj[i]; for(int j = 0; j < (int)a.size(); ++j) { if(a[j] < (int)s.size() && val[i] == val[a[j]]) { list cp = s; Remove(cp, a[j]); Remove(cp, i); if(cache.insert(cp).second) up.insert(cp); } } } } return r; } int main() { MakeAdj(); int nnn; cin >> nnn; for(int iii = 0; iii < nnn; ++iii) { list init; for(int i = 0; i < 20; ++i) { int v; cin >> v; init.push_back(v); } cout << Search(init) << endl; } }