DFS(深度优先搜索)

简介

深度优先搜索(DFS,Depth-First Search)是搜索的手段之一。它从某个状态开始,不断的转移状态直到无法转移。然后退回到前一步的状态,继续转移到其他状态,如此不断地重复直到找到最后的解。

样例一

题目

部分和问题

给定整数a1,a2----an,判断是否可以从中选出若干数,判断是否存在几个数或某个数和恰为k

分析

对于本题来说只需判断两种状态加与不加,如果此状态满足和为k返回sum==k

代码 O(2 ^n)

//输入
int a[MAX_N];
int n,k; bool dfs(int i , int sum){
if (sum == k) return sum == k; //如果和为k返回 //不加上a[i]
if(dfs(i+1,sum)) return ture; // 加上a[i]
if(dfs(i+1),sum+a[i]) return ture; // 不能凑成k就返回false
return flase;
} void solve(){
if(dfs(0,0)) cout << "Yes" <<endl;
else cout << "No" ;
}

样例二

Acwing 842. 排列数字

给定一个整数 nn,将数字 1∼n1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 nn。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤71≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10 ;

int path[N]; //表示路径
bool use[N]; // 判断数字是否被用过
int n ; void dfs(int x)
{
if (x == n) { //若找到的数字位数等于所需,直接输出结果
for (int i = 0; i < n; i ++ ) cout << path[i] << " " ;
cout << endl ;
return ;
} for (int i = 1; i <= n; i ++ ) { // 从 i = 1 开始寻找
if (!use[i]){ //如果i 没有被用过时
path[x] = i ; // 将 i 赋给 path
use[i] = 1 ; // 标记i被用过了
dfs(x + 1); // 寻找下一个数
use[i] = 0 ; // 寻找完恢复i
}
}
} int main()
{
cin >> n;
dfs(0);
return 0;
}

最新文章

  1. 如何防止DDos攻击?
  2. c语言学习第四天数据类型1
  3. Can&#39;t find keyplane iOS模拟器键盘不显示解决办法
  4. C#基础--属性 字段
  5. ZigBee profile
  6. HDU-4611 Balls Rearrangement 循环节,模拟
  7. 存储的几个LUN问题
  8. spring-事务实现原理
  9. 最短路径之BF算法+线性规划(图片格式)
  10. 依赖注入之Autofac使用总结
  11. JVM虚拟机个人理解
  12. 『扩展欧几里得算法 Extended Euclid』
  13. Python开发【第一篇】基础题目一
  14. ubuntu安装后问题
  15. 事务,acid,cap,paxos随笔
  16. X5功能目录排序
  17. 原生js---ajax---get方法传数据
  18. LeetCode题解之 3Sum
  19. IOS HTTP访问端口
  20. VC 操作 EXCEL---插入工作表(Insert.Sheet)方法

热门文章

  1. 建立局域网内使用的CentOS7-OpenStack源
  2. Build a ZenTao Server on Linux
  3. CentOS7 快速安装配置mysql8.0
  4. SpringBoot开发十六-帖子详情
  5. SpringBoot整合ActiveMq实现Queue和Topic两种模式(看不懂你来打我)
  6. java使用wol远程开机
  7. 栈编程和函数控制流: 从 continuation 与 CPS 讲到 call/cc 与协程
  8. asp.net mvc 传值
  9. Qt 的MDI 多文档窗口
  10. 【.Net】深入理解C#的装箱和拆箱