UVa

    xiaoxiao2021-04-14  39

    #include<iostream> #include<cstring> using namespace std; const int maxn = 400000; bool Vis[maxn]; int n; int D[10]; int kangtuo(int A[9]) { int t = 0; for (int i = 0; i<n; i++) { int cnt = 0; int x = A[i]; for (int j = i + 1; j<n; j++) { if (A[j]<x) cnt++; } t += cnt*D[n - i - 1]; } return t; } int In[10]; void turn(int A[9], int B[9], int l1, int r1, int l2, int r2, int &h) { h = 0; int p1 = l1, p2 = l1 + (r2 - l2), p3 = r2; for (int i = 0; i<n; i++) { if (i<p1 || i>p3) B[i] = A[i]; else if (i <= p2) { B[i] = A[i - p1 + l2]; } else { B[i] = A[i - p2 - 1 + l1]; } if (i>0 && B[i - 1] != B[i]-1) h++; else if (i == 0 && B[i] != 1) h++; } } bool dfs(int cen, int deep, int A[9], int knum) { if (cen == deep) { return knum == 0; } else { for (int i = 0; i<n; i++) { for (int j = i; j<n; j++) { int l = j + 1; for (int r = l; r<n; r++)//通过将[i,j]和[l,r]置换 { int B[9]; int h; turn(A, B, i, j, l, r, h); if (3 * (deep - cen) >= h) { int nknum = kangtuo(B); //if (!Vis[nknum])不能进行标记 { Vis[nknum] = 1; if (dfs(cen + 1, deep, B, nknum)) { return true; } } } } } } return false; } } int main() { D[0] = 1; for (int i = 1; i<10; i++) { D[i] = D[i - 1] * i; } cin >> n; for (int i = 0; i<n; i++) { cin >> In[i]; } int maxdeep = n - 1; int ans = -1; int k = kangtuo(In); for (int i = 0; i<=maxdeep; i++) { memset(Vis, 0, sizeof(Vis)); if (dfs(0, i, In, k)) { ans = i; break; } } cout << ans << endl; return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-669593.html

    最新回复(0)