题意:对于一段数字,每次可以剪切一段连续的自然数,粘贴到任意部分,使其变成升序

思路:

考虑的是进行搜索,深搜并不能保证是最短,广搜感觉每层的情况太多。

迭代加深:枚举搜索深度,然后进行深搜。

这种方法比较适用于不知道明显深度的,以及每层展开情况过多而导致bfs不行的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <queue>
  7. #include <algorithm>
  8. typedef long long ll;
  9. using namespace std;
  10.  
  11. int maxd;
  12. int n;
  13. struct node
  14. {
  15. int matrix[12];
  16. };
  17.  
  18. int get_h(node t) //可能进行的最大深度
  19. {
  20. int num = 0,i;
  21. for(i = 1; i < n; i++)
  22. if(t.matrix[i] + 1 != t.matrix[i+1])
  23. num ++;
  24. if(t.matrix[i] != n)
  25. num++;
  26. return num;
  27. }
  28.  
  29. node change(int from,int to,int x,node t) //利用数组替代指针
  30. {
  31. int tot;
  32. int next[20],tmp[20];
  33. for(int i=0; i <= n; i++)
  34. tmp[i]=t.matrix[i],next[i]=i+1;
  35. next[from-1]=to+1;
  36. next[x]=from;
  37. next[to]=x+1;
  38. for(int i=next[0],tot=1; tot<=n; i=next[i],tot++)
  39. {
  40. t.matrix[tot]=tmp[i];
  41. }
  42. return t;
  43. }
  44.  
  45. bool dfs(node cur,int tt)
  46. {
  47. int h = get_h(cur);
  48. int flag = 1;
  49. for(int i = 1; i <= n; i++)
  50. {
  51. if(cur.matrix[i] != i);
  52. {
  53. flag = 0;
  54. break;
  55. }
  56. }
  57. if(flag )
  58. return true;
  59. if(tt == maxd)
  60. return h == 0;
  61. if(tt*3+h > maxd*3)
  62. return false;
  63. for(int from = 1; from <= n; from++)
  64. for(int to = from; to <= n; to++)
  65. for(int i = 0; i <= n; i++)
  66. {
  67. node tp;
  68. memcpy(tp.matrix,cur.matrix,sizeof(int)*(n+1));
  69. if(i >= from-1 && i <= to)
  70. continue;
  71. tp = change(from,to,i,tp);
  72. if(dfs(tp,tt+1))
  73. return true;
  74. }
  75. return false;
  76. }
  77.  
  78. char ch;
  79. int main()
  80. {
  81. int cas = 1;
  82. while(scanf("%d",&n) && n)
  83. {
  84. node from;
  85. for(int i = 1; i <= n; i++)
  86. scanf("%d",&from.matrix[i]);
  87. for(maxd = 0;; maxd++) //搜索深度
  88. {
  89. if(dfs(from,0))
  90. break;
  91. }
  92. printf("Case %d: %d\n",cas++,maxd);
  93. }
  94. return 0;
  95. }

  

例 7-10 uva12212(迭代加深搜索)的更多相关文章

  1. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛 [迭代加深搜索]

    题目传送门 摩天大楼里的奶牛 题目描述 A little known fact about Bessie and friends is that they love stair climbing ra ...

  2. 【bzoj1085】【 [SCOI2005]骑士精神】启发式剪枝+迭代加深搜索

    (上不了p站我要死了,侵权度娘背锅) 如果这就是启发式搜索的话,那启发式搜索也不是什么高级玩意嘛..(啪啪打脸) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且 ...

  3. 【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解

    废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己, ...

  4. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  5. 迭代加深搜索 codevs 2541 幂运算

    codevs 2541 幂运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...

  6. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

  7. 迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神

    题目 此题根据题目可知是迭代加深搜索. 首先应该枚举空格的位置,让空格像一个马一样移动. 但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题. 感觉也想不出什么减枝,于是便要用到了乐观估计函数(O ...

  8. C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains

    此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/article ...

  9. UVA11212-Editing a Book(迭代加深搜索)

    Problem UVA11212-Editing a Book Accept:572  Submit:4428 Time Limit: 10000 mSec  Problem Description ...

  10. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

随机推荐

  1. 源端控制的OpenFlow数据面

    OpenFlow 交换机一般采用 TCAM 存储和查找流表,从而带来了扩展性.成本和能耗的问题.TCAM 成本和能耗过高,存储容量有限,一般交换机中的 TCAM 仅能存储几千条流表项,对 OpenFl ...

  2. httpClient 中的post或者get请求

    httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...

  3. wyh的数列~(坑爹题目)

    链接:https://www.nowcoder.com/acm/contest/93/K来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F( ...

  4. Microsoft Soft SQL Server 大数据----分区表性能测试

    分区表 MSSQL有一个大数据储存方案,可以提高效率那就是分区表. 使用起来跟普通表没有区别.至于具体原理自己度娘吧. 真正性能的提高,是依赖于硬件的加入.也是就说,当把一个表设置成分区表,每一个分区 ...

  5. Mybatis的原始dao开发方法

    在进入主题之前先提一下sqlSession.sqlSession是一个面向用户(程序员)的接口. sqlSession中提供了很多操作数据库的方法,如: selectOne(返回单个对象).selec ...

  6. Web Service的工作原理

    Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...

  7. kubernetes入门(05)kubernetes的核心概念(2)

    一.使用 kubectl run 创建 pod(容器) 命令 kubectl run类似于 docker run,可以方便的创建一个容器(实际上创建的是一个由deployment来管理的Pod): 等 ...

  8. Linux实战案例(5)关闭Centos的防火墙

    1.检查防火墙的状态 [root@LxfN1 ~]# service iptables status表格:filterChain INPUT (policy ACCEPT)num target pro ...

  9. Spring Security 入门(1-7)Spring Security - Session管理

    参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...

  10. JDBC学习笔记 day1

    JDBC的基本概念: JDBC就是java database connectivity,即java数据库连接. JDBC主要完成的几个任务分别为 与数据库建立一个连接 向数据库发送SQL语句 处理数据 ...