迭代加深搜索

自己看的时候第一遍更本就看不懂。。是非常水,但智商捉急也是没有办法的事情。

好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的见解,

真的是非常有帮助。或许自己想要想非常久才干想明确,还会非常痛苦,略微问一下别人的想法,点上一个方向。剩下的自己就能想得明确了。

迭代加深。

把answer(须要的步数或其它)在主函数里面从零往上递加。此之谓 “层数”,亦可谓之“深度”。用书上的话就是:

从小到大枚举深度上限maxd。每次仅仅考虑深度不超过maxd的节点。

对于能够使用回溯法求解,可是解答树的深度没有明显上限的题目,能够考虑使用迭代加深搜索。

设深度上的上限为maxd(或是设成lim)。当前结点n的深度为dep,须要一个乐观估价函数,此函数的作用推断有没有继续dfs下去的必要:

假设在理想乐观状况下,此结点往下dfs都不能达到终于目标要求。则果断须要剪枝。

(妈蛋就是干啊,写到这个地方发现自己的思路有点不清晰,可能有漏洞就回头去研究了一下代码,然后就哭了……自己原来根本没有理解透彻,须要来理清晰~所以又用掉了好长的时间来搞明确某一步是用来干神马的,真是非常二。。。

对于以下这个代码来讲,我迷乱的地方在于每次都是又一次递归还是就继续了原来的状态递归。。我一直以为是延续了原来的状态(当然之前还有其它的理解误区……太水了我当时跟本就全然没弄明确啊),可是我发现我想不通,然后一阵狂想,最后还是想不通。。然后就郁闷的从D区回到了宿舍。

。然后洗漱之后開始和某小朋友沟通交流了一些事情,某小朋友还是太懂事了搞得自己不开心了,真是笨。。

咳咳扯偏了,,

然后我在某小朋友赶我去睡觉之后,偷偷找来代码看了一眼,然后加了例如以下一组输出推断自己认知上是否有错误,然后特么果然是有错误。。。

人家本就是每次又一次遍历,根本没有延续状态。。那个类里面的内容我将其误当做全局变量真是要死啊。。

好吧那几行全是一样的输出。。

然后一切问题就算是解决完了,把代码就给出例如以下。。

卧槽还是非常蛋疼这个理解误区,这尼玛太水了吧。。菜鸟果然是菜鸟哦,不知道啥时候能进化。

。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class Board
{
public:
int a[16];
int h;
int n;
bool readIn()
{
int i;
scanf("%d",&n);
if (n == 0)
return false;
for (i=0; i<n; i++)
{
scanf("%d",a+i);
}
return true;
}
void printOut()
{
int i;
for (i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("h=%d\n",h);
}
void move(int s,int e,int p)
{
int t[16],i,j;
if (p < s)
{
for (i=0; i<p; i++)
{
t[i]=a[i];
}
for (j=s; j<=e; j++,i++)
{
t[i]=a[j];
}
for (j=p; j<s; j++,i++)
{
t[i]=a[j];
}
for (j=e+1; j<n; j++,i++)
{
t[i]=a[j];
}
}
else
{
for (i=0; i<s; i++)
{
t[i]=a[i];
}
for (j=e+1; j<p; j++,i++)
{
t[i]=a[j];
}
for (j=s; j<=e; j++,i++)
{
t[i]=a[j];
}
for (j=p; j<n; j++,i++)
{
t[i]=a[j];
}
}
memcpy(a,t,sizeof(t));
}
int getH()
{
int cnt,i;
cnt=0;
for (i=0; i<n-1; i++)
{
if (a[i+1] != a[i]+1)
cnt++;
}
if (a[i] != n)
cnt++;
h=cnt;
return cnt;
}
};
int lim;
int f(int dep,int h)
{
return dep*3+h;
}
bool IDDFS(int dep,Board b)
{
int i,j,k;
Board tb;
b.getH(); if (f(dep,b.h) > lim*3)
return false;
if (b.getH() == 0)
return true;
for (i=0; i<b.n; i++)
{
for (j=i; j<b.n; j++)
{
for (k=0; k<i; k++)
{
tb=b;
tb.move(i,j,k);
if (IDDFS(dep+1,tb) == true)
return true;
}
for (k=j+2; k<b.n; k++)
{
tb=b;
tb.move(i,j,k);
if (IDDFS(dep+1,tb) == true)
return true;
}
}
}
return false;
}
int main()
{
Board b;
int prob;
prob=1;
while (b.readIn() == true)
{
for (lim=0; ; lim++)
{
for(int i=0;i<b.n;i++)
printf("%d ",b.a[i]);
printf("\n");
if (IDDFS(0,b) == true)
break;
}
printf("Case %d: %d\n",prob,lim);
prob++;
}
}

用类写的结构体,说真的我还没用过。。

看完某些题目和某些大神打完WF的感言之后如今都认为自己写的这叫什么玩意吧==真是没什么难度了,也没啥不好学的。

这叫算法么,会这些应该是理所应当的事情吧,不练ACM预计也能会。

。就是操蛋,以后好好干,早点变大神不要再当大水笔了。

uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索的更多相关文章

  1. UVA 11212 Editing a Book [迭代加深搜索IDA*]

    11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange the ...

  2. UVa 11212 Editing a Book (IDA* && 状态空间搜索)

    题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...

  3. UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)

    题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...

  4. UVA - 11212 Editing a Book (IDA*搜索)

    题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...

  5. UVA - 11212 Editing a Book (IDA*)

    给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...

  6. UVA 11212 Editing a Book

    题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...

  7. Editing a Book UVA - 11212 IDA*

    You have n equal-length paragraphs numbered 1 to n . Now you want to arrange them in the order of 1 ...

  8. 埃及分数 迭代加深搜索 IDA*

    迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...

  9. 小结:A* & IDA* & 迭代深搜

    概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...

随机推荐

  1. mysql 更改字符集

    Windows: 安装目录下新建my.ini文件,输入一下内容 [mysqld]#修改服务器端默认字符编码格式为utf8character-set-server = utf8 [client]#修改客 ...

  2. [转]T4系列文章之3:T4语法的介绍

    本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html 因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管 ...

  3. SQL Split函数,将一串字符串返回成table

    写法一: CREATE FUNCTION [dbo].[Split] ( @str VARCHAR(MAX), --传进来的字符串 ) --分割符 ) RETURNS @t TABLE --定义一个虚 ...

  4. 简单的css缩放动画,仿腾讯新闻的分享按钮和美团app底部的图标样式

    最近看到一些好看的hover的图形缩放效果.然后自己就写了下,发现这2种效果都不错.如果伙伴们更好的实现方式可以在下面留言哦~ 还有美团的效果,我就不展示了,喜欢的可以去app应用上看看. 这两种效果 ...

  5. WordPress熊掌号页面改造,自动发布

    写在前面的话: 有很多小伙伴刚进入WordPress,对很多东西还不太了解,比如:有的主题很挑剔,对于有些插件不兼容,但是呢对于这个功能有不可或缺.所以,这时候就需要我们自己手动修改或者添加代码,来实 ...

  6. Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  7. python学习笔记(6)——for...in &while

    for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句. 注意:python中的格式也起到语法规则的作用,缩进块就是一个例 求和问题,比较异同 1/sum= ,,,,,,,,,]: ...

  8. java.net.MalformedURLException: no protocol: www.baidu.com

    URL url = new URL("www.baidu.com");改为 URL url = new URL("http://www.baidu.com");

  9. JavaScript ES6 数组新方法 学习随笔

    JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...

  10. css--小白入门篇5

    一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. 1 line-height: 40px; 文字,是在自己的行里面 ...