深度优先搜索

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值