You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.0 KiB

2 years ago
#include <iostream>
#include <bits/stdc++.h>
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;
}