【题意】

  有n个数字的全排列,每次可以剪切一段粘贴到某个位置。问最后变成升序最少多少步。

如“{2,4,1,5,3,6}要2步

{3,4,5,1,2}只要一步

【分析】

  迭代深搜真的AC了也觉得慌= =

  【其实看到这题不应该想到宽搜么???

  全排列只有9!=362880个

  这题的IDA*的估价函数特别机智:

  n<=9,最多2需要8步,深度上限为8。

  考虑后继不正确的赎回自个数h,可以证明每次剪切时候h最多减少3,因此当3*d+h>3*maxd时可以剪枝。

  【证明上面那个画一下就知道,一次复制粘贴只有3个东西的后继被影响。【机智ORZ  ....  

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 15
10
11 int a[Maxn][Maxn],v[Maxn];
12 int maxd,n;
13 bool ok;
14
15 bool ffind(int x,int h)
16 {
17     if(x==maxd)
18     {
19         if(h!=0) return 0;
20         ok=1;return 1;
21     }
22     if(3*x+h>3*maxd) return 0;
23     for(int i=1;i<=n;i++)
24      for(int j=i;j<=n;j++)
25      {
26         for(int k=1;k<i;k++)
27         {
28             for(int l=i;l<=j;l++) a[x+1][k+l-i]=a[x][l];
29             for(int l=k;l<i;l++) a[x+1][l+j-i+1]=a[x][l];
30             for(int l=1;l<k;l++) a[x+1][l]=a[x][l];
31             for(int l=j+1;l<=n;l++) a[x+1][l]=a[x][l];
32             h=0;
33             for(int l=1;l<n;l++) if(a[x+1][l+1]!=a[x+1][l]+1) h++;
34
35             ffind(x+1,h);
36             if(ok==1) return 1;
37         }
38         for(int k=j+1;k<=n;k++)
39         {
40             for(int l=i;l<=j;l++) a[x+1][k+l-j]=a[x][l];
41             for(int l=1;l<i;l++) a[x+1][l]=a[x][l];
42             for(int l=j+1;l<=k;l++) a[x+1][l-j+i-1]=a[x][l];
43             for(int l=k+1;l<=n;l++) a[x+1][l]=a[x][l];
44             h=0;
45             for(int l=1;l<n;l++) if(a[x+1][l+1]!=a[x+1][l]+1) h++;
46             ffind(x+1,h);
47             if(ok==1) return 1;
48         }
49      }
50     return 0;
51 }
52
53 int main()
54 {
55     int kase=0;
56     while(1)
57     {
58         ok=0;
59         scanf("%d",&n);
60         if(n==0) break;
61         for(int i=1;i<=n;i++) scanf("%d",&a[0][i]);
62         int h=0;
63         for(int i=1;i<n;i++) if(a[0][i+1]!=a[0][i]+1) h++;
64         printf("Case %d: ",++kase);
65         for(maxd=0;maxd<=n-1;maxd++)
66         {
67             if(ffind(0,h)) {printf("%d",maxd);break;}
68         }
69         printf("\n");
70     }
71     return 0;
72 }

View Code

2016-11-15 09:13:56

  

转载于:https://www.cnblogs.com/Konjakmoyu/p/6064366.html

【Uva11212】 Editing a Book(IDA*)相关推荐

  1. 【WINAPI】MessageBox细解(二)

    [WINAPI]MessageBox细解(二) 0x00 简介 0.1 关于 0.2 工具 0x01 程序对象 0.1 程序源码 1.2 运行结果 0x02 函数细解 2.1 前篇回顾 2.2 静态分 ...

  2. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

  3. 【Android】Parse开发笔记(1)—— 准备

    一.简介 Parse是由 YC 孵化出来的.专为移动应用提供后台服务的云计算平台,为开发者包办繁琐的后台服务,让开发者只需专注于具体的开发工作.它提供任意数据保存.照片或其它文件存储.发送推送通知.创 ...

  4. 【 MATLAB 】DFT性质讨论(一)线性、循环反转、共轭与实序列的对称性的MATLAB实现

    上篇博文通过在理论上讨论了DFT的三个性质:[ MATLAB ]DFT性质讨论(一)线性.循环反转与共轭 分别讨论: 一.线性 给出一个例子,给出x1和x2,x3 = 0.3*x1+0.8*x2; 之 ...

  5. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  6. linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  7. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  8. 【BZOJ1934】善意的投票(网络流)

    [BZOJ1934]善意的投票(网络流) 题面 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己 ...

  9. 【BZOJ1797】[AHOI2009]最小割(网络流)

    [BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...

最新文章

  1. vs2012无法启动已配置的开发Web服务器
  2. No identifier specified for entity
  3. 全球及中国木材加工行业运行状况与投资产值预测报告2022版
  4. nodogsplash的内部机制分析
  5. 机器学习(K-means聚类原理以及用法)
  6. 关于index.html被缓存问题
  7. STM32工作笔记0020---新建工程模板基于寄存器-M3
  8. PYTHON_SPLIT
  9. 基于Java的学生信息管理系统
  10. MPush安装部署应用
  11. 常见软件架构风格介绍
  12. 用电脑计算器计算以2为底的对数
  13. Algorithms, Part I by Kevin Wayne, Robert Sedgewick
  14. GitHub项目之12306抢票软件
  15. saas系统项目总结
  16. 使用B站API:http://api.bilibili.com/x/space/upstat?mid=2026561407获取播放量、点赞量的返回报文中data数据缺失问题排查(已解决)
  17. PHP中=是什么意思
  18. 基于gradle的dependency-management配置实现多模块springboot依赖库的版本管理
  19. 【Python学习随笔】依赖倒置原则 + 简单工厂模式
  20. 经典C语言程序设计100例,部分有个人注解

热门文章

  1. 推荐Web开发人员应有的7款免费的Android应用
  2. 美国体验圣帕特里克节(St.Patrick's Day)
  3. Mysql查看和修改时区
  4. 大数据发行版本+组件中的竞品/等同地位关系(持续更新中)
  5. On branch master nothing to commit, working tree clean
  6. 【机器学习】主题模型
  7. python123 ios_Python的iOS自动化打包实例代码
  8. java.lang.IllegalArgumentException 严重: Context initialization failed
  9. php服务docker化,docker化你的PHP应用环境Nginx PHP-FPM
  10. 怎么检测计算机硬件好坏,驱动人生怎么看电脑硬件 硬件检测教程介绍