intf(){ int res = 0; for (int i = 1; i < n; i++) { if (a[i] + 1 != a[i + 1]) res++; } return (int) ((res + 2) / 3); }
voidout(){ for (int i = 1; i <= n; i++) cout << a[i] << ' '; cout << endl; }
boolida(int now, int max_d){ if (now + f() > max_d) returnfalse; if (!f()) returntrue; for (int len = 1; len <= n; len++) { // 段长度 for (int j = 1; j <= n - len + 1; j++) { // 段起始下标 int seg_end = len + j - 1; // 段终止下标 for (int k = seg_end + 1; k <= n; k++) { // 插入到下标k的元素后面 memcpy(cpy[now], a, sizeof a); int y = j; for (int x = seg_end + 1; x <= k; x++, y++) a[y] = cpy[now][x]; for (int x = j; x <= seg_end; x++, y++) a[y] = cpy[now][x]; if (ida(now + 1, max_d)) returntrue; memcpy(a, cpy[now], sizeof cpy[now]); } } } returnfalse; }
int t; cin >> t; while (t--) { int dep = 0; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; while (!ida(0, dep) && dep < 5) dep++; if (dep == 5) cout << "5 or more" << endl; else cout << dep << endl; }
boolida(int now, int max_dep, char last){ if (now + f() > max_dep) returnfalse; if (check()) returntrue; for (int i = 0; i <= 7; i++) { if (now && last != '\0') { if (last == 'A' && i == 5) continue; if (last == 'F' && i == 0) continue; if (last == 'B' && i == 4) continue; if (last == 'E' && i == 1) continue; if (last == 'C' && i == 7) continue; if (last == 'H' && i == 2) continue; if (last == 'D' && i == 6) continue; if (last == 'G' && i == 3) continue; } memcpy(cpy[now], a, sizeof a); operate((char) (i + 'A')); seq[now] = (char) (i + 'A'); if (ida(now + 1, max_dep, (char) (i + 'A'))) returntrue; memcpy(a, cpy[now], sizeof cpy[now]); } returnfalse; }