搜索专题(一)

 

搜索的种类:

搜索用很多实用和高效的算法。

举个栗子:广度优先搜索(bfs),深度优先搜索(dfs),枚举大法,蒙特卡洛树等等——详见百度百科《搜索算法》。

 

常用搜索简介:

广度优先搜索:

广度优先搜索,又称宽度优先搜索,简称广搜或宽搜。从当前位置开始进行四面八方搜索。

深度优先搜索:

深度优先搜索,简称深搜。与广度优先搜索相反,从当前位置一直向前搜索,知道不能搜索再改变方向。

枚举:

枚举,通过字面意思可知。就是将所有需要搜索的内容搜索过去,也是最暴力的算法,通常用于基础的枚举题中。

 

深搜、回溯:

回溯应该算是深搜的一种,准确地说它可以通过深搜来实现。

来一道经典到不能再经典的回溯例题:

八皇后问题:

——by USACO

题目描述(大意):

在一个8*8的棋盘上放置8个皇后,每个皇后都能攻击自己所在的行、列及两条对角线上的其他皇后。我们在保证每个皇后安全的情况下,计算出放置皇后的方案数。

题目思路如下:

通过放置每一个皇后来进去深度优先搜索,并判断没用皇后可以攻击,如果会攻击到其他皇后就回溯一步。直到道将八个皇后全部放置完毕后输出。

代码实现(伪):

int b[N],c[N],d[N];//分别表示列和两条对角线。

 

inline void outo()

{

    .....//输出不解释

}

 

inline void dfs(int k)//表示递归到的层数

{

    if(k==9)//放置完了八个皇后

    {

        outo();//输出

        return ;//返回,这里的空格可以不加,按照个人的喜好来。

    }

    if(!b[i] && !c[i+j+7] && !d[i-j+7])//+7是为了避免出现数组中下标负数的情况。

    {b[i]=1,c[i+j+7]=1,d[i-j+7]=1;dfs(k+1);}//保存结果并继续递归

    b[i]=0;c[i+j+7]=0;d[i-j+7]=0;//回溯一步

}

 

 

你可能感兴趣的:(搜索专题(一))