IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 递归与dfs深度优先搜索 -> 正文阅读

[数据结构与算法]递归与dfs深度优先搜索

递归实现指数型枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>    
using namespace std;

int sta[16];   //开状态数组,全局数组,每个函数都能改,dfs函数调用时不用传入
				//全局变量,初始值就是0,sta[0]==0
//0--还没考虑,1--选,2--不选
int n;   //定义到全局变量,不用传入函数

void dfs(int u)    //u是当前位置,
{
	if (u>n)     //输出过程,u是从1开始,所以结束标志就是u>n
	{
		for (int i = 1; i <= n; i++)
			if (sta[i] == 1)
				printf("%d ", i);
		puts("");//打印换行
		return;
	}
    
	sta[u] = 2;//遍历,不选分支,
	dfs(u + 1);//递归第一个分支
	sta[u] = 0;//恢复现场,

	sta[u] = 1;//遍历,选分支,
	dfs(u + 1);//递归第二个分支,选分支,
	sta[u] = 0;


}


int main()
{
	cin >> n;
	dfs(1);    //从第一位开始(为了方便,数范围就是1~15,和给的数字范围匹配)
}

递归实现排列型枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>    
using namespace std;
//顺序:依次枚举每个个位置放哪个数,
//递归树
int n;

int sta[10]; //0表示没放数,1~n表示放了哪个数
int used[10];  //全局变量都为0
void dfs(int u)
{
	//step1,输出最后一层,每个坑里的萝卜输出出来
	if (u > n) //边界
	{
		for (int i = 1; i <= n; i++)
			cout << sta[i] << " ";  //打印方案
		puts("");
		
	}
	//step2,依次枚举每个分支,即当前位置可以填哪些数,
	for (int i = 1; i <= n; i++)
	{
		if (!used[i])
		{
			sta[u] = i;
			used[i] = 1;
			dfs(u + 1);

			//恢复现场,有借有还
			sta[u] = 0;
			used[i] = 0;
		}
	}
}
int main()
{

	cin >> n;
	dfs(1);  //输入的是位置


}

递归实现组合型枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
//sta[]数组装萝卜,层数u,
//组合,升序组合,不重复,就要设star,就是从哪里开始选
//如i==1选了,那下一位就从star==i+1==2开始
//与全排列不同,不用判是否为空use[]
const int N = 40;
int sta[N];

void dfs(int u, int star)
{
    //step1,拔萝卜
	if (u > m)
	{
		for (int i = 1; i <= m; i++)
			printf("%d ", sta[i]);
		puts("");
		return;
	}
	//step2,递归,dfs
	for (int i = star; i <= n; i++)
	{
		sta[u] = i;
		dfs(u + 1, i + 1);
		sta[u] = 0;  //恢复现场 ,回溯
	}

}

int main()
{
	
	cin >> n >> m;
	dfs(1, 1);//深度优先搜索,u==1,star==1
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不知细叶谁裁出,二月春风似剪刀

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2022年2月6日23:44:15? ?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:58:02  更:2022-02-07 13:58:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:31:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码