#include<cstdio> #include<cstring> #include<iostream> usingnamespace std; constint N = 20; int n, a[N], dep;
intgj(){ int cnt = 0; for (int i = 1; i < n; i++) if (a[i] + 1 != a[i+1]) cnt++; if (a[n] != n) return cnt + 1; return cnt; }
voidwork(int l, int r, int t){ int b[N], p = r; for (int i = l; i <= t; i++) { b[i] = a[++p]; if (p == t) p = l - 1; } for (int i = l; i <= t; i++) a[i] = b[i]; }
booldfs(int now){ int cnt = gj(); if (!cnt) return1; if (3 * now + cnt > 3 * dep) return0; int c[N]; memcpy(c, a, sizeof(c)); for (int l = 1; l <= n; l++) for (int r = l; r <= n; r++) for (int t = r + 1; t <= n; t++) { work(l, r, t); if (dfs(now + 1)) return1; memcpy(a, c, sizeof(a)); } return0; }
voidBooksort(){ cin >> n; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (dep = 0; dep <= 4; dep++) if (dfs(0)) { cout << dep << endl; return; } puts("5 or more"); }
intmain(){ int t; cin >> t; while (t--) Booksort(); return0; }
intvalue(){ int cnt = 0; for (int i = 1; i + 1 <= n; ++i) { if (a[i + 1] != a[i] + 1) ++cnt; } return (cnt + 2) / 3; }
booldfs(int now){ int cnt = value(); if (cnt == 0) returntrue; if (now + value() > depth) returnfalse; memcpy(backup[now], a, sizeof a); for (int l = 1; l <= n; ++l) { for (int r = l; r <= n; ++r) { for (int k = r + 1; k <= n; ++k) { for (int x = l, y = r + 1; x <= k; ++x, ++y) { a[x] = backup[now][y]; if (y == k) y = l - 1; } if (dfs(now + 1)) returntrue; memcpy(a, backup[now], sizeof a); } } } returnfalse; }
intmain(){ int T; cin >> T; while (T--) { cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; depth = 0; while (depth < 5 && !dfs(0)) ++depth; if (depth < 5) cout << depth << endl; else cout << "5 or more" << endl; } }
int n, maxs, sqmr; __int64 square[60], base_square[6][6];
inlineinthori(int r, int c){ return (2 * n + 1) * (r - 1) + c; } inlineintverti(int r, int c){ return (2 * n + 1) * (r - 1) + c + n; } inline __int64 place(int r){ return ((__int64)1 << (r - 1)); }
voidgenerate(void) { int i, j, l, m, k; sqmr = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { square[sqmr] = (place(hori(i, j)) | place(hori(i + 1, j)) | place(verti(i, j)) | place(verti(i, j + 1))); base_square[i - 1][j - 1] = square[sqmr++]; } } for (k = 2; k <= n; k++) { for (i = 1; i + k - 1 <= n; i++) { for (j = 1; j + k - 1 <= n; j++) { square[sqmr] = 0; for (l = 0; l <= k - 1; l++) { for (m = 0; m <= k - 1; m++) square[sqmr] ^= base_square[i + l - 1][j + m - 1]; } sqmr++; } } } }
int maxdepth; intdfs(__int64 serial, int step) { int i, h = 0; __int64 ch, useful = 0, t = serial; for (i = 0; i < sqmr; i++) { if ((t & square[i]) == square[i]) { h++; t ^= square[i]; if (useful == 0) useful = square[i]; } } if (h == 0) return1; elseif (step + h > maxdepth) return0; for (i = 1; i <= maxs; i++) { ch = place(i); if (useful & ch) if (dfs(serial ^ ch, step + 1)) return1; } return0; }
intmain() { freopen("mag.in", "r", stdin); freopen("mag.out", "w", stdout); int kase, k, a; __int64 ori; scanf("%d", &kase); for (; kase > 0; kase--) { scanf("%d", &n); maxs = 2 * n * (n + 1); sqmr = 0; generate(); ori = (((__int64)1 << maxs) - 1); scanf("%d", &k); for (; k > 0; k--) { scanf("%d", &a); ori ^= place(a); } for (maxdepth = 0; ; maxdepth++) if (dfs(ori, 0)) break; printf("%d\n", maxdepth); } fclose(stdin); fclose(stdout); return0; }