1. 深度优先搜索算法的概念:
深度优先搜索属于图算法的一种,英文缩写为DFS(Depth First Search.)其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
DFS适合此类题目:给定初始状态跟目标状态,要求判断从初始状态到目标状态是否有解。
2、原理详解
(深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形)
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
3.深度优先搜索基础模板
void dfs(int k)
{
if(满足输出条件)
{
输出解;
}
for(int i=1;i<=尝试方法数;i++)//遍历所有可能
if(满足情况的话)
{
为进一步搜索标记一下;
dfs(k+1);
回溯;
}
}
基本例题
洛谷 p1706 全排列问题
题目描述
输出自然数 1 到 n 所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
输出格式
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。
输入输出样例
输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
说明/提示 1≤n≤9
//这是一道最基本的深搜模板题,入门必备,直接上代码
//差不多可以直接根据上面那个基本模板直接套
#define isc(x) scanf("%d",&x)
#define ipr(z) printf("%d\n",z)
#define mem(x,y) memset(x,y,sizeof(x))
#include<bits/stdc++.h> //万能头文件
#include<algorithm>
typedef long long ll;
using namespace std;
inline void read(long long int &num){
//快读
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
num = s