题目链接:

https://vjudge.net/problem/UVA-11212

题意:

题解:

IDA*,每次改变深度上限去剪枝

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define MS(a) memset(a,0,sizeof(a))
 5 #define MP make_pair
 6 #define PB push_back
 7 const int INF = 0x3f3f3f3f;
 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
 9 inline ll read(){
10     ll x=0,f=1;char ch=getchar();
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 //
16 const int maxn = 1e5+10;
17
18 int n;
19 int a[15];
20
21 bool is_sort(){
22     for(int i=1; i<=n; i++)
23         if(a[i] != i) return false;
24     return true;
25 }
26
27 int h(){  // 估值函数,有几个位置不正确,就是 不连续的位置
28     int cnt = 0;
29     for(int i=1; i<n; i++)
30         if(a[i]+1 != a[i+1]) cnt++;
31     if(a[n] != n) cnt++;
32     return cnt;
33 }
34
35
36 bool dfs(int cur,int maxd){
37     if((maxd-cur)*3 < h()) return false;  // 剪枝, 每剪切一次,最多使三个位置正确
38     if(is_sort()) return true;
39
40     int b[15],olda[15];
41     memcpy(olda,a,sizeof(a));
42     for(int i=1; i<=n; i++)
43         for(int j=i; j<=n; j++){ // 枚举剪切位置
44             int cnt=1;
45             for(int k=1; k<=n; k++){
46                 if(k<i || k>j) b[cnt++] = a[k];  // 没有剪掉的数字
47             }
48
49             for(int p=1; p<=cnt; p++){ // 枚举放在哪个位置
50                 int cnt2 = 1;
51                 for(int k=1; k<p; k++) a[cnt2++] = b[k];
52                 for(int k=i; k<=j; k++) a[cnt2++] = olda[k];
53                 for(int k=p; k<cnt; k++) a[cnt2++] = b[k];
54                 if(dfs(cur+1,maxd)) return true;
55                 memcpy(a,olda,sizeof(olda));
56             }
57         }
58
59     return false;
60 }
61
62 int solve(){
63     int maxd;
64     if(is_sort()) return 0;
65     for(maxd=1; maxd<=8; maxd++){ // 最多9个数字,最大也就移动8次
66         if(dfs(0,maxd)) return maxd;
67     }
68 }
69
70 int main(){
71     int cas = 0;
72     while(scanf("%d",&n) && n){
73         for(int i=1; i<=n; i++)
74             a[i] = read();
75         printf("Case %d: %d\n",++cas,solve());
76     }
77
78     return 0;
79 }

转载于:https://www.cnblogs.com/yxg123123/p/6827604.html

紫书搜索 例题7-10 UVA - 11212 Editing a Book 迭代加深搜索 IDA*相关推荐

  1. C++迭代加深搜索及其例题讲解—————Addition Chains

    前言: 学习算法时,一个关键的问题是什么时候来使用它.在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说 ...

  2. 启发式搜索 迭代加深搜索 搜索对象的压缩存储

    常见的几种搜索算法 常见的几种搜索算法_唐宋缘明卿_cris的博客-CSDN博客_搜索算法有哪些 搜索 -- 启发式搜索 搜索 -- 启发式搜索_Alex_McAvoy的博客-CSDN博客_启发式搜索 ...

  3. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  4. UVa 1533:Moving Pegs(迭代加深搜索)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=842& ...

  5. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

  6. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

  7. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  8. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

  9. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

最新文章

  1. cv2.rectangle()画出矩形的用法
  2. 设计模式(五)责任链模式
  3. matlab基本杆组-运动学仿真,MATLAB基本杆组-运动学仿真.pdf
  4. 如何快速学好Shell脚本?
  5. 2000坐标系高程与85高程转换_科普 | 如何在大疆智图中设置坐标系
  6. 人脉社群系统源码人脉推广裂变源码群发布源码
  7. java lang保_android – Gson中的RuntimeException解析JSON:无法调用受保护的java.lang.ClassLoader()而没有args...
  8. android7 编译配置摄像头,MTK平台新增摄像头指南 -- 已更新android 7.0路径的更改。...
  9. PHP中global与$GLOBALS的区别
  10. igllib 204 gradient
  11. 二叉树平衡因子应用举例
  12. intellij idea设置代码提示不区分大小写
  13. 步进电机基础(5.9)-步进电机的驱动与控制-三相步进电机的驱动电路
  14. 阿里巴巴大数据技术专家岗面试题
  15. Mastermind游戏
  16. python自动发邮件运行正常就是收不到邮件是为什么_Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式...
  17. 树状数组的理解以及简单应用
  18. OA和BPM有什么区别?企业应该如何选型
  19. java 三个点号...的含义-可变参数
  20. 蚂蚁花呗账单分期和交易分期的费用如何计算?

热门文章

  1. typescript用什么软件写_为什么都2019年了大家还喜欢用TypeScript?
  2. Spring Cloud:多网卡问题
  3. 【linux】修改机器时间
  4. datagrid出现相同两组数据_数据分析之统计学
  5. JAVA 三种线程实现创建方式
  6. hadoop集群swap_性能瓶颈--MEM(swap)
  7. linux shell zsh,Linux终极shell Z Shell 用强大的zsh oh-my-zsh把Bash换掉
  8. java1234小峰推荐书籍_java1234 webservice 第2 课 cfx实现
  9. python编程语言一览_编程语言学习:python有趣用法汇总
  10. 动态时间规整_动态规划-数组系列(10%)