#include #include using namespace std; const int N = 20; int q[N]; int g[10][N]; int n; int f() { int tot = 0; for (int i = 1; i <= n - 1; i++) if (q[i] + 1 != q[i + 1]) tot++; return (tot + 2) / 3; } bool panduan() { for (int i = 1; i <= n; i++) if (q[i] != i) return false; return true; } bool dfs(int u, int depth) { if (u + f() > depth) return false; if (panduan()) { return true; } for (int len = 1; len < n; len++) for (int qi1 = 1; qi1 + len - 1 <= n; qi1++) { int r = qi1 + len; for (int wai = r; wai <= n; wai++) { memcpy(g[u], q, sizeof q); // memccpy(g[u],q,sizeof q); int i, j; for (i = qi1, j = r; j <= wai; i++, j++) q[i] = g[u][j]; for (j = qi1; j <= qi1 + len - 1; i++, j++) q[i] = g[u][j]; if (dfs(u + 1, depth)) { return true; } memcpy(q, g[u], sizeof g[u]); } } return false; } int main() { freopen("180.in", "r", stdin); // 记录开始时间 clock_t begin = clock(); int T; scanf("%d", &T); while (T--) { scanf("%d", &n); // 表示书的数量 for (int i = 1; i <= n; i++) scanf("%d", &q[i]); int depth = 0; while (depth < 5 && !dfs(0, depth)) depth++; // while (depth <= 5 && !dfs(0, depth)) depth++; // 会有1个测试点超时 // 提醒我们:在使用迭代加深时,要严格注意depth的边界范围 if (depth < 5) cout << depth << endl; else cout << "5 or more" << endl; } // 记录结束时间 clock_t end = clock(); cout << "Running time:" << (double)(end - begin) / CLOCKS_PER_SEC * 1000 << "ms" << endl; return 0; }