正如书上所说,本题需要用IDA*算法求解

启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数)

可见迭代递归的核心思想是枚举ans去dfs是否可行,相反常规搜索是dfs去需找ans。

一开始卡在状态图的转移与回溯上,参考(http://blog.csdn.net/sssogs/article/details/8836606)大神的代码后得到启发,可以将图或是表直接写成结构体或是类跟着递归走(当然,图或是表不能很大,比较大的话应该还是用回溯比较好吧)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#define maxn 20
using namespace std;
int maxd,cnt;
class MyClass{
public:
int map[maxn];
int h,n;
void move(int s,int e,int k){
int t[maxn];
for (int i=;i<k;i++){
t[i]=map[i];
}
for (int i=s;i<=e;i++){
t[k+i-s]=map[i];
}
int top=k+e-s;
for (int i=k;i<n;i++){
if (i<s||i>e) t[++top]=map[i];
}
memcpy(map,t,sizeof(t));
}
void move2(int s,int e,int k){
int t[maxn],i,j;
for (i=; i<s; i++)
{
t[i]=map[i];
}
for (j=e+; j<k; j++,i++)
{
t[i]=map[j];
}
for (j=s; j<=e; j++,i++)
{
t[i]=map[j];
}
for (j=k; j<n; j++,i++)
{
t[i]=map[j];
}
memcpy(map,t,sizeof(t));
}
int getH(){
h=;
for (int i=;i<n-;i++)
if (map[i]+!=map[i+]) h++;
if (map[n-]!=n) h++;//经过测试,这一句减掉了60%的搜索量.......之前一直TLE,天呢,又是一下午
return h;
}
bool init(){
cin>>n;
if (n==) return false;
for (int i=;i<n;i++){
cin>>map[i];
}
return true;
}
};
int IDAdfs(int d,MyClass c){
c.getH();
MyClass tc;
cnt++;
if (c.h==) return ;
//if (d==maxd&&c.h>0) return 0;
if (*d+c.h>*maxd) return ;
for (int i=;i<c.n;i++)
for (int j=i;j<c.n;j++){
for (int k=;k<i;k++){
tc=c;
tc.move(i,j,k);
if (IDAdfs(d+,tc)) return ;
}
for (int k=j+; k<c.n; k++)
{
tc=c;
tc.move(i,j,k);
if (IDAdfs(d+,tc) == true)
return true;
}
}
return ;
}
int main()
{
MyClass b;
int prob;
prob=;
while (b.init() == true)
{
cnt=;
for (maxd=; ; maxd++)
{
if (IDAdfs(,b) == true)
break;
}
printf("Case %d: %d\n",prob,maxd);
prob++;
//cout<<cnt<<endl;
}
}

UVa11212,Editing a Book的更多相关文章

  1. 【Uva11212】 Editing a Book(IDA*)

    [题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也 ...

  2. 3.2 配置构建Angular应用——简单的笔记存储应用

    本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  4. Enterprise Library 服务问题

    在使用Enterprise Library而没有注册服务的时候会出现这样的问题,"Editing Post "Failed to create instances of perfo ...

  5. UITableView的编辑模式

    UITableView可以分普通模式和Editing模式两种,这里我们着重讨论Editing模式,Editing模式中又分三种操作:Insert.Delete. Reallocted.Insert和D ...

  6. Windows Community Toolkit 4.0 - DataGrid - Part02

    概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我们针对 DataGrid 控件的 CollectionView 部分做了详细 ...

  7. 3.2.1 配置构建Angular应用——简单的笔记存储应用——展示功能

    本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...

  8. 框架入门经典项目TodoMVC

    一.项目介绍 ①地址:http://todomvc.com/ ②GitHub下载模板 ③通过npm下载模板的样式 ④通过npm下载Vuejs ⑤项目文件,主要修改app.js和index.html两个 ...

  9. vue之TodoMVC项目实战

    一.初始化项目 1.下载模板 进入github中https://github.com/tastejs/todomvc-app-template,并且在命令行将其clone下来 git clone ht ...

随机推荐

  1. 201521123031 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 答:实现con ...

  2. 201521123066 《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.多态性: (1)概念:相同的方法名,不同的实现方法 (2)instanceof运算符:判 ...

  3. 201521123106《java程序设计》第二周学习总结

    1. 本周学习总结 学习了java的基础语法.在java中使用浮点型会不精确,改用double行就好.学习了string的类型,string的对象是不可变的,创建之后不能再修改,在string的拼接中 ...

  4. 201521123007《Java程序设计》第1周学习总结

    1. 本周学习总结 了解了JAVA语言的发展历史及特点,还有JDK.JRE.JVM三者之间的关系,安装并设置JAVA开发平台,使用Notepad++和Eclipse编辑器编写JAVA程序并运行,学会使 ...

  5. 201521123013 《Java程序设计》第10周学习总结

    1. 本章学习总结 2. 书面作业 Q1.finally题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally块中的异常必须在fina ...

  6. Java程序设计-表达式运算(个人博客)

    1.团队课程设计博客链接 洪亚文博客链接:http://www.cnblogs.com/201521123065hyw/ 郑晓丽博客链接:http://www.cnblogs.com/zxl3066/ ...

  7. Hibernate中cascade属性的区别

    xml对于集合的级联操作属性cascade的取值可以是: none: 不级联操作,默认为none save-update:针对的是当对当前对象进行save或update操作时,要对想关联的对象进行sa ...

  8. 关于IOS的屏幕适配(iPhone)——资源适配

    IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...

  9. jsonp其实很简单【ajax跨域请求】

    js便签笔记(13)——jsonp其实很简单[ajax跨域请求] 前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资 ...

  10. python pyinstaller打包exe暗坑1

    环境 python2.7.9 win-xp 今天打包了一个小脚本,结果打开报错