#include #include #include #include using namespace std; map, int> Cache; int Rec(const vector& v) { map, int>::iterator it = Cache.find(v); if (it != Cache.end()){ return it->second; } int res = (int)v.size(); for (int i = 0; i < (int)v.size(); ++i){ if (i % 4 < 3 && i + 1 < (int)v.size()){ if (v[i] == v[i + 1]){ vector next = v; next.erase(next.begin() + i, next.begin() + i + 2); res = min(res, Rec(next)); if (res == 0){ break; } } } if (i % 4 < 3 && i + 5 < (int)v.size()){ if (v[i] == v[i + 5]){ vector next = v; next.erase(next.begin() + i + 5); next.erase(next.begin() + i); res = min(res, Rec(next)); if (res == 0){ break; } } } if (i + 4 < (int)v.size()){ if (v[i] == v[i + 4]){ vector next = v; next.erase(next.begin() + i + 4); next.erase(next.begin() + i); res = min(res, Rec(next)); if (res == 0){ break; } } } if (i % 4 > 0 && i + 3 < (int)v.size()){ if (v[i] == v[i + 3]){ vector next = v; next.erase(next.begin() + i + 3); next.erase(next.begin() + i); res = min(res, Rec(next)); if (res == 0){ break; } } } } Cache.insert(make_pair(v, res)); return res; } main() { int loop; cin >> loop; while (loop--){ vector v; for (int i = 0; i < 20; ++i){ int in; cin >> in; v.push_back(in); } cout << Rec(v) << endl; } }