当前位置: 首页 > news >正文

UVA 11212 Editing a Book

  • LOGOUT
  • bbsh
    • UPDATE
UVA - 11212
Editing a Book
Time Limit: 10000MS  64bit IO Format: %lld & %llu

Submit Status uDebug

Description

Download as PDF
 
 

思路:

      既然做到这道题了,就详细的写写IDA*的精髓。方便自己,也方便别人。

     做这道题的时候首先看了一下刘汝佳老师的分析(详见紫书P208),需要利用IDA*算法进行分析,之后上网查了一下关于IDA*算法的介绍,大体意思就是:首先将初始状态结点的H值设为阈值maxH,然后进行深度优先搜索,搜索过程中忽略所有H值大于maxH的结点;如果没有找到解,则加大阈值maxH,再重复上述搜索,直到找到一个解。

关于这IDA*的减枝策略,每遍历一个深度的时候,进行判断:

当前局面的估价函数值 + 当前深度 > 预定义最大搜索深度 

的时候进行减枝。

就能这道题而言,假如我们定义一个数字是不是位置正确:这个数 x 是否 等于 这个数 后面的 数 y - 1,也就是

x =? y - 1,如果等于,说明这个数位置正确,如果不等于,说明这个数位置错误,位于最后一个位置的数的时候,判断他是不是等于n,比如:4,5,6,1,2,3 这个序列存在2个不正确位置数,分别是6(后面是1)和3(3不等于6)。

下面进行这道题的减枝的分析(也叫做启发函数),当你改变一个区间的位置,你会改变3个数的位置的正确性

比如 1,2,3,4,5,6.序列,你把2,3移动到6后面,那么1的后面变成了5, 而 6的后面编程了2,而3的后面变成 空了,所以每次移动一个区间,最多可以改变3个数的正确性,也就是说,对于这道题

如果遍历到了一个深度, (还能遍历的深度 - 当前深度) *3 < 不正确数字的个数,那么就没有必要继续遍历了,因为往后你就是全把这些数字该对了也无法达到理想状态。

知道这个之后时间复杂度的问题就得到解决了,下面我们只需要每次枚举该步的所有移动就可以了。

移动的话,实际就是2个相邻区间的交换,比如A B C D(字母代表区间),将A移动到C后面,也可以看成A 和(BC)互换,所以实质就是相邻区间的互换。

具体的话大家独立思考一下,再看代码吧。

AC代码:

 

#include<cstdio>
#include<cstring>
using namespace std;
const int N=10;
int n,cas,a[N];
int query(){
    int cnt=0;
    for(int i=1;i<n;i++) if(a[i-1]+1!=a[i]) cnt++;
    if(cnt>0) cnt++;
    return cnt;
}
bool success(){
    for(int i=1;i<n;i++) if(a[i-1]+1!=a[i]) return 0;
    return 1;
}
void create(int start,int len,int k){//将a~b范围内的数移动到c的后面,也就是[a,b]与(b,c]互换
    int olda[N];
    memcpy(olda,a,sizeof a);
    int i=0;
    for(int z=0;z<k;z++){
        if(z>=start&&z<start+len){z+=len-1;continue;}
        a[i++]=olda[z];
    }
    for(int z=0;z<len;z++) a[i++]=olda[start+z];
    for(int z=k;z<n;z++){
        if(z>=start&&z<start+len){z+=len-1;continue;}
        a[i++]=olda[z];
    }
}
bool dfs(int d,int maxd){
    int h=query();
    if(3*d+h>3*maxd) return 0;
    if(success()) return 1;
    int tmp[N];
    memcpy(tmp,a,sizeof a);
    for(int i=0;i<n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=0;k<=n;k++){
                if(k>=i&&k<=j){k=j;continue;}
                create(i,j-i,k);//把k到i范围内的数组移动到j的后面
                if(dfs(d+1,maxd)) return 1;
                memcpy(a,tmp,sizeof a);
            }
        }
    }
    return 0;
}
int solve(){
    if(success()) return 0;
    for(int k=1;k<5;k++) if(dfs(0,k)) return k;
    return 5;
}
int main(){
    while(scanf("%d",&n)==1&&n){
        for(int i=0;i<n;i++) scanf("%d",a+i);
        int ans=solve();
        printf("Case %d: %d\n",++cas,ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/shenben/p/5882991.html

相关文章:

  • tomcat报错:java.net.SocketException: Permission denied[http-nio-80]
  • 入手阿里云新服务器的部署NODE
  • C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有
  • 运行时添加log4j2的appender
  • win产品密钥大搜集
  • PowerShell查询AD域内长期没有登录的计算机对象
  • 取distinct数据同时还取其他字段
  • RHCS+Conga+GFS+cLVM共享存储的高可用性web集群
  • 【20160924】GOCVHelper综述
  • Maven 自定义 archetype
  • 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题
  • 7.12 Java-based container configuration (基于java的容器配置)
  • 从根开始的DNS服务器架构,让整个互联网掌控于你的手中
  • 设计模式(五)简单工厂模式+工厂方法模式
  • CentOS 6.5升级Python和安装IPython(亲测可用)
  • 《Java编程思想》读书笔记-对象导论
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Angular4 模板式表单用法以及验证
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • centos安装java运行环境jdk+tomcat
  • laravel with 查询列表限制条数
  • Nacos系列:Nacos的Java SDK使用
  • nginx 负载服务器优化
  • ReactNative开发常用的三方模块
  • React组件设计模式(一)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 高度不固定时垂直居中
  • 工作中总结前端开发流程--vue项目
  • 设计模式走一遍---观察者模式
  • 十年未变!安全,谁之责?(下)
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 我从编程教室毕业
  • 我感觉这是史上最牛的防sql注入方法类
  • 一道面试题引发的“血案”
  • 【云吞铺子】性能抖动剖析(二)
  • ​iOS安全加固方法及实现
  • ​学习一下,什么是预包装食品?​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十三)Maven插件解析运行机制
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)UDP基本编程步骤
  • (转)重识new
  • (状压dp)uva 10817 Headmaster's Headache
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .php结尾的域名,【php】php正则截取url中域名后的内容