POJ3460 Booksort

题意:给定一个长度为n的序列,每次可以取出其中的一段数,插入任意一个位置,问最少需要几次操作才能使整个序列变为1~n

  • 思路:IDA*+迭代加深搜索
  • 小技巧:将一段数插入到另一段,等价于交换相邻的两端
  • 估价函数:每次操作最多改变三个数的后继,统计错误后继的个数再/3即为最少需要的步数
  • 代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstring> inline int read()
{
int x(0),f(1); char ch;
while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return f*x;
}
#define res register int
const int N=30;
int a[N],n; inline int f()
{
int tmp(0);
for(res i=1 ; i<=n-1 ; i++)
if(a[i+1]!=a[i]+1) tmp++;
if(a[n]!=n) tmp++;
return tmp;
} //将一段插入到另一段等价于交换相邻的两段
inline void move(int x1,int x2,int x3)
{
int b[N],j=0;
for(res i=x2+1 ; i<=x3 ; i++)
b[++j]=a[i];
for(res i=x1 ; i<=x2 ; i++)
b[++j]=a[i];
for(res i=x1,k=1 ; i<=x3 ; i++,k++)
a[i]=b[k];
} int dfs(int depth,int max_dep)
{
for(res x1=1 ; x1<=n-1 ; x1++)
for(res x2=x1 ; x2<=n-1 ; x2++)
for(res x3=x2+1 ; x3<=n ; x3++)
{
move(x1,x2,x3);
int h=f();
if(!h) return 1;
else if(depth+(int)ceil((double)h/3)<=max_dep)
{
if(dfs(depth+1,max_dep)) return 1;
}
move(x1,x3-(x2-x1)-1,x3);//还原
}
return 0;
} int main()
{
int T=read();
while(T--)
{
n=read();
for(res i=1 ; i<=n ; i++) a[i]=read();
if(f()==0)
{
puts("0");
continue;
}
for(res max_dep=1 ; max_dep<=4 ; max_dep++)
{
if(dfs(1,max_dep)) {
printf("%d\n",max_dep);
break;
}
if(max_dep==4) puts("5 or more");
}
}
return 0;
}

  

POJ3460 Booksort(IDA*)的更多相关文章

  1. Booksort POJ - 3460 (IDA*)

    Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...

  2. UVA - 10384 The Wall Pusher(推门游戏)(IDA*)

    题意:从起点出发,可向东南西北4个方向走,如果前面没有墙则可走:如果前面只有一堵墙,则可将墙向前推一格,其余情况不可推动,且不能推动游戏区域边界上的墙.问走出迷宫的最少步数,输出任意一个移动序列. 分 ...

  3. 人类即将进入互联网梦境时代(IDA)

    在电影<盗梦空间>中,男主角科布和妻子在梦境中生活了50年,从楼宇.商铺.到河流浅滩.一草一木.这两位造梦师用意念建造了属于自己的梦境空间.你或许并不会想到,在不久未来,这看似科幻的情节将 ...

  4. POJ2286 The Rotation Game(IDA*)

    The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 5691   Accepted: 19 ...

  5. poj2331 (IDA*)

    题意:给你k种管道,然后是每种的长度,每种的数量,求(x1,y1)到(x2,y2)所用管道的最少数量 思路: 最开始考虑的是直接bfs,但是没有成功. 然后发现可以先找x轴x1 到 x2 ,再找y轴y ...

  6. UVA-10384 The Wall Pushers (IDA*)

    题目大意:走迷宫,遇到墙时可以推着墙走,但墙后还是墙时便不能推.求出一条任意的最短路径. 题目分析:这道题出的比较人性,输入的时候便是将四周的墙用二进制数表示好了,其实这样减轻了做题人的负担.IDA* ...

  7. POJ - 2286 - The Rotation Game (IDA*)

    IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...

  8. 骑士精神(IDA*)

    题目描述 输入格式 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 对于每组数据都 ...

  9. BZOJ 1085(IDA*)

    题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...

随机推荐

  1. 在JS中使用全局变量

    在JS中使用全局变量不像C++,也不像PHP. 先摆出错的代码: var globalvar = 'a'; function test(){ alert(globalvar); } 这里弹出的是und ...

  2. zip多个分割文件合并

    copy /b 1.z01+1.z02+1.zip 注意:1.zip在最后

  3. velocity在html中换行符转换

    <td colspan="3" class="tdContent2">$!obj.getDealInfo().replaceAll("\r ...

  4. [分享]PY的Boost自动编译程序 1.1 根据环境自动编译

    Python写的Boost自动编译程序 1.1 改进: 根据自己的环境筛选出已安装环境,并列出 环境提供选择. 支持X64位的自动参数编译. 可以选择编译的参数,其他版本持续改进中 自动编译自动安装到 ...

  5. RabbitMQ的一些说明

    下载安装包后,运行会提示你下再ErLang环境,根据提示下载安装就可以了 RabbitMQ 自己的插件包中带一 个WebUI的管理工具,在RabbitMQ安装目录(bin)下运行 rabbitmq-p ...

  6. asp.net core 1.1 mysqlsugarCore mysql.data 要 7.0.5.0

    Message=Could not load file or assembly 'MySql.Data, Version=7.0.5.0, Culture=neutral, PublicKeyToke ...

  7. Python之模块和包学习

    模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...

  8. 20169205实验三 敏捷开发与XP实践

    20169205实验三 敏捷开发与XP实践 实验内容及步骤 (一)敏捷开发与XP基本知识 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 一项实践在XP环境 ...

  9. MFC中的一般经验之谈----OnInitialUpdate

    在MFC程序设计中,按照传统的设计,如果处理WM_PAINT消息,一般会派生一个OnPaint函数,映射到WM_PAINT消息上进行绘图处理.但是很多程序中并没有出现OnPaint,一个OnDraw函 ...

  10. 用shell脚本 计算两个数的加减乘除取余

    #! /bin/bash # read -p '请输入数:' a //输入 read -p '请输入数:' b echo '$a+$b=' $(( a + b )) //输出 echo '$a-$b= ...