搜索入门

搜索------在解空间中寻找目标状态

通过不停的试探去寻找解的一种算法。与其说是一种算法,不如说是一种方法。基础的方法有暴力的搜索法,深搜,广搜三种。更高级的有IDDFS,DBFS,A*,IDA*等等。利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题解的一种方法。

一、深度优先搜索(DFS)

“一条道走到黑。”:DFS(Depth-First Search)是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解。例:数独,全排列(next_permutation),N皇后问题

算法过程:

VOID DFS(状态A)

1.判断当前的状态是否合法。合法后则继续执行,否则则回到上次调用。

2.先下走一层,也就是调用DFS(状态A)

例1:全排列

void dfs(已经固定了k个数剩下的数全排列,是哪k个数通过标记该数字用没用过来显示)

{

  如果已经求出来了k>n 输出,返回

  否则i从1到 n 循环

  如果i 没有用过,那么就将 i 固定在当前位置上,并调用dfs(k+1)

  在调用完dfs(k+1)后需要将固定在当前位置上的 i 拿走

}

  2:N皇后

  由于皇后的摆放位置不能通过某种公式来确定,因此对于每个皇后的摆放位置都要进行试探纠正,这就是“回溯”的思想。

  在N个皇后未放置完成前,摆放第 i 个皇后和第i+1 个皇后的试探方法是相同的,因此完全可以采用递归的方法来处理。

  由于皇后本身的特殊性质,即一行一列只能有一个皇后,所以我们要做的就是,从第0行开始摆放,一直摆到第n-1行为止。

  (uva167)

  3:马踏棋盘

  把问题抽象出来,就是有一个人(也就是那个棋盘中的马),要对整个图进行一次遍历,不重不漏;

  其次考虑这个马的走法(8种);

  接着如何去在程序里面表现出这个棋盘;

  最后就是套用回溯法的主要结构;

DFS的大体框架:

  试探节点A  A是否满足在这个图(或树)中

  如果在,标记A如果已经被试探过的话,所影响的各种值;

  紧接着,去试探所有的A可以达到的节点;

  等待所有的都执行完之后,还原标记A;

二、广度优先搜索(BFS)

 

原文地址:https://www.cnblogs.com/Cloud-king/p/8335964.html