dfs——深度优先搜索
前言:
介绍: 深度优先搜索,又称dfs,是一种图的搜索方法。算法的基本思想是:从图的某一个节点出发,沿着某一条路径一直往下搜索,直至该条路径的所有节点均被访问,则向上回溯,寻找没有被访问的节点。这个算法的思想有点类似于我们之前学过的暴力求解法,即枚举问题的所有可能的情况,对每一种情况进行讨论,然后找到符合问题的解。
算法优点: 思维量小,不需要费脑筋。也不挑题型,几乎所有的题型均可用dfs(但是有些题并不适用dfs)。申明一下,可用和适用是两回事。
算法缺点: 时间复杂度较高,只适用于问题规模较小的问题。对于输入规模较大的问题,dfs算法将不再适用。(这里的不适用,并不是不能求解,而是求解问题所需要的时间太久)。
为什么要学? 深度优先搜索虽然是图的一种搜索方式,但是它的算法思想常常被我们用来解决生活中一些其他的问题。例如,一些问题的解没有规律,需要讨论问题的每一种情况来求解,如果使用其他算法,问题的解的准确率得不到保证。这时候我们就可以采用dfs。
入门案例——数字排列和组合
问题描述: 现有五张卡牌,上面分别有数字1、2、3、4、5。让你从从中选出三张卡牌,组成一个三位数,且每个三位数的大小不同,问你能组成多少个三位数?
输出示例:
1 2 3
1 2 4
1 2 5
1 3 2
1 3 4
1 3 5
1 4 2
1 4 3
1 4 5
1 5 2
1 5 3
1 5 4
2 1 3
2 1 4
2 1 5
2 3 1
2 3 4
2 3 5
2 4 1
2 4 3
2 4 5
2 5 1
2 5 3
2 5 4
3 1 2
3 1 4
3 1 5
3 2 1
3 2 4
3 2 5
3 4 1
3 4 2
3 4 5
3 5 1
3 5 2
3 5 4
4 1 2
4 1 3
4 1 5
4 2 1
4 2 3
4 2 5
4 3 1
4 3 2
4 3 5
4 5 1
4 5 2
4 5 3
5 1 2
5 1 3
5 1 4
5 2 1
5 2 3
5 2 4
5 3 1
5 3 2
5 3 4
5 4 1
5 4 2
5 4 3
代码示例:
#include<bits/stdc++.h>
using namespace std;
int visit[6];//标识数组,若数字 i 已经被选择了,则arr[i]=1,反之,arr[i]=0
int arr[4];// 用存放每次找到三位数的结果 ,arr[1]、arr[2]、arr[3]表示三个盒子
void dfs(int num)
int main(){
dfs(1);// 先找一号盒子中的数字
return 0;
}
void dfs(int num){
if(num>3){
// 打印结果
for(int i=1;i<=3;i++){
cout<<setw(3)<<arr[i];
}
cout<<endl;
return ;
}
for(int i=1;i<=5;i++){
// 先判断数字 i 是否被已经被选择了
if(!visit[i]){
// 如果没被选择,将数字 i 标识为已选择,即visit[i]=1
visit[i]=1;
// 把数字 i 存进结果数组arr中
arr[num]=i;
// 寻找下一个盒子中的数字
dfs(num