【Uva11212】 Editing a Book(IDA*)

【题意】

  有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 }

2016-11-15 09:13:56

  

时间: 2024-11-08 09:33:12

【Uva11212】 Editing a Book(IDA*)的相关文章

【UVa】1374 Power Calculus(IDA*)

题目 题目 ? ? 分析 IDA*大法好,抄了lrj代码. ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxans=14; int n,a[maxans+1]; bool dfs(int d,int maxd) { if(a[d] == n) return true; if(d == maxd) return false;

【OpenGL】Shader实例分析(七)- 雪花飘落效果

转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChan

【函数】Oracle函数系列(1)--字符函数

[函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 常见字符函数(lower.upper.initcap.concat.substr.length.intr.lpad.rpad.trim.chr.ascii.replace.translate)的使用 ② 判断字符串中是否含有汉字 ③ substr和instr的联合使用 ④

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

在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇可以绕着手机屏幕边线移动并且可以改变方向 一.添加状态并修改代码 首先我们来用另外一种方式实现上一版本中的刷新界面,在Crazy贪吃蛇(1)中我们自定义了一个线程每隔1s钟刷新界面,在线程中我们使用了postInvalidate()方法通知主线程重绘界面,我们打开View的源代码看看到底是如何通知主线程的,原代码如下: public void postInvalidate(int

洛谷P3379 【模板】最近公共祖先(LCA)

P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有倍- 题面这个地方写错了 无论是用RMQ+dfs还是tarjan- 为什么我的倍增超时了 求助!为什么只有70分 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接

【OpenGL】Shader实例分析(六)- 卡牌特效

转发请保持地址:http://blog.csdn.net/stalendp/article/details/30989295 本文将介绍怎么通过alpha通道来隐藏信息,并实现卡牌特效.运行效果如下: 代码如下: Shader "stalendp/imageShine" { Properties { _MainTex ("image", 2D) = "white" {} _NoiseTex("noise", 2D) = &qu

【雷电】源码分析(三)-- 游戏背景

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置.同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置 当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().由于常常会对函数getScroll

【Web】Yslow优化法则(四)启用Gzip压缩

目前世界上主要有来自四个不同机构的四种的Web浏览器内核.每一家机构都推出了至少一种使用自己的内核的浏览器产品. 这四家机构分别是Microsoft.Mozilla.Apple和Opera SAS,提供的内核则分别叫做Trident.Gecko.WebKit和Presto,推出的主打浏览器则分别叫做Internet Explorer.Firefox.Safari和Opera. 人们常常也用主打浏览器的名字来代替内核的名字,特别是对不开源的Trident和Presto,几乎人人都称之为"IE内核&

【C语言】【数据结构】菜鸟学习日志(四) 用二叉树实现非递归排序

唉,由于要备战考研,这篇博文可能是我这一年最后一次更新啦! 其实断断续续的也没有写很多,而且大多都是很初级.很简单的东西,没有和大家分享什么高阶的东西.这也正应了我们<菜鸟学习日志>的标题嘛! 不过说回来我还是很喜欢写博文的.一方面总结学到的知识,以后也可以自己看看别做了就忘了:另一方面,写博文也让我在学习的过程中更加认真,以免分享了错误的知识. 写的东西好不好呢是一说,好像有一些点击量,不过看的人估计也不多.只是我还算乐在其中吧! 大学生活说到底过得有点浪了,导致我苦逼地走向了考研的不归路-