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

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

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

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

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <string>
  5. #include <algorithm>
  6. #define maxn 20
  7. using namespace std;
  8. int maxd,cnt;
  9. class MyClass{
  10. public:
  11. int map[maxn];
  12. int h,n;
  13. void move(int s,int e,int k){
  14. int t[maxn];
  15. for (int i=;i<k;i++){
  16. t[i]=map[i];
  17. }
  18. for (int i=s;i<=e;i++){
  19. t[k+i-s]=map[i];
  20. }
  21. int top=k+e-s;
  22. for (int i=k;i<n;i++){
  23. if (i<s||i>e) t[++top]=map[i];
  24. }
  25. memcpy(map,t,sizeof(t));
  26. }
  27. void move2(int s,int e,int k){
  28. int t[maxn],i,j;
  29. for (i=; i<s; i++)
  30. {
  31. t[i]=map[i];
  32. }
  33. for (j=e+; j<k; j++,i++)
  34. {
  35. t[i]=map[j];
  36. }
  37. for (j=s; j<=e; j++,i++)
  38. {
  39. t[i]=map[j];
  40. }
  41. for (j=k; j<n; j++,i++)
  42. {
  43. t[i]=map[j];
  44. }
  45. memcpy(map,t,sizeof(t));
  46. }
  47. int getH(){
  48. h=;
  49. for (int i=;i<n-;i++)
  50. if (map[i]+!=map[i+]) h++;
  51. if (map[n-]!=n) h++;//经过测试,这一句减掉了60%的搜索量.......之前一直TLE,天呢,又是一下午
  52. return h;
  53. }
  54. bool init(){
  55. cin>>n;
  56. if (n==) return false;
  57. for (int i=;i<n;i++){
  58. cin>>map[i];
  59. }
  60. return true;
  61. }
  62. };
  63. int IDAdfs(int d,MyClass c){
  64. c.getH();
  65. MyClass tc;
  66. cnt++;
  67. if (c.h==) return ;
  68. //if (d==maxd&&c.h>0) return 0;
  69. if (*d+c.h>*maxd) return ;
  70. for (int i=;i<c.n;i++)
  71. for (int j=i;j<c.n;j++){
  72. for (int k=;k<i;k++){
  73. tc=c;
  74. tc.move(i,j,k);
  75. if (IDAdfs(d+,tc)) return ;
  76. }
  77. for (int k=j+; k<c.n; k++)
  78. {
  79. tc=c;
  80. tc.move(i,j,k);
  81. if (IDAdfs(d+,tc) == true)
  82. return true;
  83. }
  84. }
  85. return ;
  86. }
  87. int main()
  88. {
  89. MyClass b;
  90. int prob;
  91. prob=;
  92. while (b.init() == true)
  93. {
  94. cnt=;
  95. for (maxd=; ; maxd++)
  96. {
  97. if (IDAdfs(,b) == true)
  98. break;
  99. }
  100. printf("Case %d: %d\n",prob,maxd);
  101. prob++;
  102. //cout<<cnt<<endl;
  103. }
  104. }

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. 201521123004 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:从ArrayList ...

  2. 201521123115《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E re ...

  3. PHP封装数据库连接

    将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...

  4. Calico 的默认连通性 - 每天5分钟玩转 Docker 容器技术(69)

    前面我们完成了 Calico 网络的部署并运行了容器,今天将讨论 Calico 的连通性. 测试一下 bbox1 与 bbox2 的连通性: ping 成功,数据包流向如下图所示. ① 根据 bbox ...

  5. Java-判断一个数是不是素数

    import java.util.Scanner; /** * @author 薛定谔的猫 * java判断一个数是不是素数 * * 素数又称质数,是指在一个大于1的自然数中,除了1和本身之外,不能被 ...

  6. [04] 利用注解生成实体类对应的建表sql语句

    1.实现功能 我们已经对注解有了基本的认识,知道了如何自定义注解,如何使用和最基本的处理注解. 本篇主要介绍,如何使用运行时级别的注解,配合反射来自动生成建表的sql语句.如下例: 我们有实体类Stu ...

  7. 《Head First 设计模式》读书笔记(1) - 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  8. Python学习笔记012_网络_异常

    1,Python如何访问互联网? url + lib =  urllib >>> # 使用urllib包下的request模块 >>> >>> i ...

  9. getOutputStream() has already been called for this response

    错误日志里偶尔会有getOutputStream() has already been called for this response这个错误 最近发现了高概率复现条件,所以顺手解决了一下: 首先根 ...

  10. 用static声明的函数和变量小结

    static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...