dfs——深度优先搜索 详解

本文探讨了深度优先搜索算法,包括其工作原理、在数字排列、n皇后问题和迷宫问题中的应用,以及优化方法——剪枝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值