UVa_11212(迭代加深搜索)

来源:互联网 发布:sqlserver列明别名 编辑:程序博客网 时间:2024/05/16 09:09
#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;}
0 0
原创粉丝点击