码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 11212 Editing a Book

时间:2015-10-11 18:03:42      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

题意:

  有一篇由n个自然段组成的文章。希望将他们排成递增序列。只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段。

分析:

  用IDA*算法求解。当3*d+h>maxd时剪枝。

代码:

  
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
string goal;
int n;
bool dfs(int d,int maxd,string now)
{
int i,j,k;
if(d==maxd)
{
return now==goal;
}
int h=0;
for(i=0;i<n-1;++i)
if(now[i+1]-now[i]!=1)
++h;
if(d*3+h>3*maxd)
return false;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
for(k=0;k<i;k++)
{
string p=now.substr(0,k);
string q=now.substr(i,j-i+1);
string r=now.substr(k,i-k);
string t=now.substr(j+1,n-j);
if(dfs(d+1,maxd,p+q+r+t))
return true;
}
}
}
return false;
}
int main()
{
int a,cas=0;
while(scanf("%d",&n)&&n)
{
string start="";
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a);
start+=(‘0‘+a);
}
goal="";
for(char c=‘1‘;c<=‘0‘+n;++c)
goal+=c;
for(int maxd=0;;maxd++)
{
if(dfs(0,maxd,start))
{
printf("Case %d: %d\n",++cas,maxd);
break;
}
        }
}
}

UVA 11212 Editing a Book

标签:

原文地址:http://www.cnblogs.com/137033036-wjl/p/4869535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!