1:DFS(深度优先搜索)
DFS有点类似于暴力枚举但是又走了一些不寻常的路将程序运行时间缩短了。(通俗的讲就是一路走到底,不撞南墙不回头)
这里我们使用八皇后的经典例子。
八皇后问题 ( 英文 : Eight queens ):是由国际 西洋棋 棋手马克斯·贝瑟尔于1848年提出的问题,是 回溯算法 的典型案例。. 问题表述为:在8×8格的 国际象棋 上摆放8个 皇后 ,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
八皇后问题有一个非常重要的点
那就是皇后所在的一行,一列,两条对角线上不能有其他的皇后。需要一个check来进行检测。
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int a[N];//表示第i行上的皇后放于a[i]列上
int cnt,n;
bool check(int x,int y) //检测
{
for(int i=1; i<=x; i++)
{
if(a[i]==y) return false;
if(i+a[i]==x+y) return false;
if(i-a[i]==x-y) return false;
}
}
void dfs(int row)
{
if(row==n+1)//表示有了一组解
{
cnt++;
return;
}
for(int i=1; i<=n; i++)
{
if(check(row,i))
{
a[row]=i;
dfs(row+1);
a[row]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}
八皇后的棋盘如果越大,所需要运行的时间就越长。这里我们就不得去介绍另一个搜索方式BFS(广度优先搜索)
2:BFS(广度优先搜索)
我们约定:按照顺时针顺序进行
BFS用到了队列,采用入队的方式将可拓展的点纳入队列之中,然后将原节点出队。
这里我使用走迷宫的经典例题来解释
起点的坐标为(1,1)步数为0。(为了方便我们将字母替换为数字。)
这时候我们进行一个标注,并且寻找其可拓展点。
寻找到拓展点后将拓展点入队,并将头节点(起点)出队。
接着,寻找拓展点的可拓展点。并将新的可拓展点入队,而原拓展点就成了头节点,这个时候将头节点进行出队。
以此类推
就出现了,到达终点需要7步。
因时间问题,代码还未进行实现。