标签:des style http os io for ar art

3 6 1 3 4 6 2 5 5 5 4 3 2 1 10 6 8 5 3 4 7 2 9 1 10
2 3 5 or more
思路:因为最多只有四步操作,可以考虑迭代加深DFS,结果试了一下最后一组样例都跑不出来。参考了一下学长的做法,还要加个函数求出可能的最小步数来剪枝。
#include <stdio.h>
#include <math.h>
int n,num[15],lim;
bool flag;
int h()
{
int i,r=0;
if(num[0]!=1) r++;
if(num[n-1]!=n) r++;
for(i=0;i<n-1;i++) if(num[i]+1!=num[i+1]) r++;
return r;
}
void dfs(int cnt)
{
if(flag) return;
int i;
for(i=0;i<n;i++) if(num[i]!=i+1) break;
if(i==n)
{
flag=1;
return;
}
if(cnt>=lim) return;
if(cnt+ceil(h()/3.0)>lim) return;//ceil(h()/3.0)至少还需要的步数,实际可能比他还大
int len,pos,j,p,temp[15];
for(i=0;i<n;i++) temp[i]=num[i];//把序列存到temp数组中
for(i=0;i<n;i++)
{
for(len=1;len<=n-i;len++)
{
for(pos=0;pos<=n-len;pos++)
{
if(pos==i) continue;
for(j=0;j<len;j++) num[pos+j]=temp[i+j];
for(p=0,j=0;j<n;)
{
if(pos==j) j+=len;
if(j>=n) break;
if(p==i) p+=len;
num[j++]=temp[p++];
}
dfs(cnt+1);
}
}
}
for(i=0;i<n;i++) num[i]=temp[i];//别忘了恢复数组
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&num[i]);
flag=0;
for(lim=0;lim<5;lim++)
{
dfs(0);
if(flag) break;
}
if(flag) printf("%d\n",lim);
else printf("5 or more\n");
}
}
HDU-1685-Booksort(IDA*),布布扣,bubuko.com
标签:des style http os io for ar art
原文地址:http://blog.csdn.net/faithdmc/article/details/38491903