您的位置:首页 > 其它

UVa_11212(迭代加深搜索)

2017-04-13 20:04 561 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: