uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
迭代加深搜索
自己看的时候第一遍更本就看不懂。。是非常水,但智商捉急也是没有办法的事情。
好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的见解,
真的是非常有帮助。或许自己想要想非常久才干想明确,还会非常痛苦,略微问一下别人的想法,点上一个方向。剩下的自己就能想得明确了。
迭代加深。
把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*) 迭代加深搜索的更多相关文章
- 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 ...
- UVa 11212 Editing a Book (IDA* && 状态空间搜索)
题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...
- UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...
- UVA - 11212 Editing a Book (IDA*搜索)
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...
- UVA - 11212 Editing a Book (IDA*)
给你一个长度为n(n<=9)的序列,每次可以将一段连续的子序列剪切到其他地方,问最少多少次操作能将序列变成升序. 本题最大的坑点在于让人很容易想到许多感觉挺正确但实际却不正确的策略来避开一些看似 ...
- UVA 11212 Editing a Book
题意: 有一篇由n个自然段组成的文章.希望将他们排成递增序列.只能剪贴和粘贴交替进行,剪贴时可以剪贴一段连续的自然段. 分析: 用IDA*算法求解.当3*d+h>maxd时剪枝. 代码: #in ...
- 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 ...
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- 小结:A* & IDA* & 迭代深搜
概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...
随机推荐
- Silverlight环境配置
今天对Silverlight安装环境进行了配置,本系统已经安装VS2010 和 Silverlight 5. 要开发Silverlight必须安装Developer Runtime 和 SDK , 且 ...
- (1)指针、引用、const限定符
自己看书时的一些理解,可能有错误的地方.随着指针的使用增多,会不断修改这篇文章的内容,过去错误的会用划线划去后保留. 1.对引用.指针.常量引用.指向常量的指针.常量指针的理解 //对引用.指针.常量 ...
- Spark学习之数据读取与保存(4)
Spark学习之数据读取与保存(4) 1. 文件格式 Spark对很多种文件格式的读取和保存方式都很简单. 如文本文件的非结构化的文件,如JSON的半结构化文件,如SequenceFile结构化文件. ...
- Android Programming 3D Graphics with OpenGL ES (Including Nehe's Port)
https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html
- Android学习笔记(四) JAVA基础知识回顾
一.接口 1)接口中定义的方法都是public权限,并且默认为public,而不是default. 2)接口的实现(implements)是特殊的继承,类似于父类子类的关系,可以向上转型(非常重要). ...
- PHP7中session_start 使用注意事项,会导致浏览器刷时页面数据不更新
//PHP7中session_start 使用注意事项, session_start([ 'cache_limiter' => 'private', //在读取完毕会话数据之后马上关闭会话存储文 ...
- jsp学习笔记 - 内置对象 pageContext
1.pageContext几乎可以操作所有的页面内置对象 pageContext.getRequest(); 得到的对象只是属于ServletRequest类,httpServletReques ...
- 关于联想笔记本不能连接无线网(wifi),注销后重新登录才可以连接
解决联想笔记本wifi问题(果果) 最近很多使用联想的朋友都遇到了这样一个问题,那就是笔记本的wifi突然不能用了,好吧,其实我个人也遇到了这个问题,但是网上貌似对这个问题并没有给出一个可以解决的办法 ...
- 15年第六届蓝桥杯第七题_(string)
手链样式 小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙.他想用它们串成一圈作为手链,送给女朋友.现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢? 请你提交该整数.不要填写任 ...
- 11Java Server Pages 动作
Java Server Pages 动作 JSP标准动作 分类 JSP标准动作 存取JavaBean相关 <jsp:useBean> <jsp:setProperty> < ...