搜索模板
2015-09-19 23:36
190 查看
深度优先搜索,就是将可能的答案从头到尾进行递归枚举,在确定前一部分的情况下,根据规则往下扩展答案树,直到得到可行的答案
广搜,借助队列实现,扩展节点入队
双向广搜,双向扩展结点,在两个方向的扩展顺序上,可以轮流交替进行,但由于大部分的解答树并不是棵完全树 ,在扩展完一层后,下一层则选择结点个数较少的那个方向先扩展,可以克服两个方向结点生成速度不平衡的状态,明显提高搜索效率
剪枝
1.如果当前节点已经到达过,就可以直接剪掉,这个可以用哈希表来实现,也可以根据情况直接开一个Judge数组
2.使用估价函数判定,如果在最乐观的情况下,所需要的步数仍然不如已经找到的最优解,就直接剪掉
注意事项
1.在传递参数的过程中,如果把当前状态也传了过来,就一定要开一个备份,直接对备份进行操作,然后把备份作为参数传下去,这之后再把备份改回原来的状态
2.在搜索方案的过程中,如果在往下走之前把judge数组设了一,递归完一定要再改成零
3.在循环搜索填下一个空的时候,如果开了变量,要对状态进行一定处理,并有他进行judge数组记录,在需要回溯的时候一定要看好,这个变量还是不是从一开始穿上来的那个状态引出来的
4.一定要设置边界
5.在判重的时候,在队首元素入队前设标记,在扩展节点前判定标记,在入队新状态前设标记
框架:
1.深搜
View Code
5.位运算加速
·x&-x 返回最低一位1
·x ^ 1 等价于!x
广搜,借助队列实现,扩展节点入队
双向广搜,双向扩展结点,在两个方向的扩展顺序上,可以轮流交替进行,但由于大部分的解答树并不是棵完全树 ,在扩展完一层后,下一层则选择结点个数较少的那个方向先扩展,可以克服两个方向结点生成速度不平衡的状态,明显提高搜索效率
剪枝
1.如果当前节点已经到达过,就可以直接剪掉,这个可以用哈希表来实现,也可以根据情况直接开一个Judge数组
2.使用估价函数判定,如果在最乐观的情况下,所需要的步数仍然不如已经找到的最优解,就直接剪掉
注意事项
1.在传递参数的过程中,如果把当前状态也传了过来,就一定要开一个备份,直接对备份进行操作,然后把备份作为参数传下去,这之后再把备份改回原来的状态
2.在搜索方案的过程中,如果在往下走之前把judge数组设了一,递归完一定要再改成零
3.在循环搜索填下一个空的时候,如果开了变量,要对状态进行一定处理,并有他进行judge数组记录,在需要回溯的时候一定要看好,这个变量还是不是从一开始穿上来的那个状态引出来的
4.一定要设置边界
5.在判重的时候,在队首元素入队前设标记,在扩展节点前判定标记,在入队新状态前设标记
框架:
1.深搜
int gethash(status a) { int res = 0; int k = 1; int i, j; //此处的4为每个位能达到的最大数+1 for (i = 1; i <= 4; i++) for (j = 1; j <= 4; j++) { res += a.map[i][j] * k; k *= 3; } return res; }
View Code
5.位运算加速
·x&-x 返回最低一位1
·x ^ 1 等价于!x
相关文章推荐
- C++ Primer Plus(第6版) 第3章编程练习
- 配置maven
- Android开发之BroadcastReceiver
- 在Linux下安装RabbitMQ
- DNS-上课内容
- 『解开人生的迷茫』
- 博客的第一次作业
- 【编程题】-C++实现:五只猴子分桃
- java快捷键大全
- windows查看端口占用命令
- 文章的感想
- House Robber II 解答
- 浅谈对git的认识
- 杭电OJ-- 2094 产生冠军
- selenium+python的WebDriverWait使用方法
- BestCoder Round #56 (div.2)
- 2015沈阳网络赛 1002(HDU 5451 矩阵快速幂 + 矩阵循环群)
- hdu1084代码过程的反省
- 包含min函数的栈
- [Mac] Terminal and Vim theme