您的位置:首页 > 其它

搜索模板

2015-09-19 23:36 190 查看
深度优先搜索,就是将可能的答案从头到尾进行递归枚举,在确定前一部分的情况下,根据规则往下扩展答案树,直到得到可行的答案

广搜,借助队列实现,扩展节点入队

双向广搜,双向扩展结点,在两个方向的扩展顺序上,可以轮流交替进行,但由于大部分的解答树并不是棵完全树 ,在扩展完一层后,下一层则选择结点个数较少的那个方向先扩展,可以克服两个方向结点生成速度不平衡的状态,明显提高搜索效率

剪枝

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

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: