DFS专题训练1

简介: DFS专题训练1

1_1:AcWing 93. 递归实现组合型枚举(dfs)

题目链接

从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。


输入格式

两个整数 n,m ,在同一行用空格隔开。


输出格式

按照从小到大的顺序输出所有方案,每行 1 个。


首先,同一行内的数升序排列,相邻两个数用一个空格隔开。


其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。


数据范围

n>0 ,

0≤m≤n ,

n+(n−m)≤25


输入样例:

5 3


输出样例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5


思考题:如果要求使用非递归方法,该怎么做呢?


解析:为了得到一个字典序,只需要从最小的1为根开始往下面搜索即可

#include <iostream>
#include <vector>
using namespace std;
const int N = 30;
int n, m;
bool st[N];
vector<int>ans;
void dfs(int u)
{
    if(ans.size() == m)
    {
        for (auto p : ans)
            cout << p << ' ';
        cout << endl;
        return ;
    }
    for (int i = u; i <= n; i ++ )
    {
        if(!st[i])
        {
            st[i] = true;
            ans.push_back(i);
            dfs(i);
            ans.pop_back();
            st[i] = false;
        }
    }
}
int main()
{
    cin >> n >> m;
    dfs(1);
    return 0;
}


1_2:AcWing 129. 火车进栈(dfs + stack)

题目链接

这里有 n 列火车将要进站再出站,但是,每列火车只有 1 节,那就是车头。


这 n 列火车按 1 到 n 的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。


也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。


车站示意如图:

出站<——    <——进站
                 |车|
                 |站|
                 |__|


现在请你按《字典序》输出前 20 种可能的出栈方案。


输入格式

输入一个整数 n,代表火车数量。


输出格式

按照《字典序》输出前 20 种答案,每行一种,不要空格。


数据范围

1≤n≤20


输入样例:

3


输出样例:

123
132
213
231
321


解析:

75500e439eba4d6aaefe0b0cdf4b307f.png


#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int n;
vector<int>ans;
stack<int>st;
int u = 1, cnt = 20;
void dfs()
{
    if(!cnt) return ; //  方案最多输出20种
    if(ans.size() == n)
    {
        cnt --;
        for (auto x : ans)
            cout << x;
        cout << endl;
        return ;
    }
    if(st.size()) // 栈里面不空
    {
        ans.push_back(st.top());
        st.pop();
        dfs();
        st.push(ans.back());
        ans.pop_back();
    }
    if(u <= n)
    {
        st.push(u);
        u ++;
        dfs();
        st.pop();
        u --;
    }
}
int main()
{
    cin >> n;
    dfs();
    return 0;
}


目录
相关文章
|
11月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
947 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
机器学习/深度学习 Java 网络架构
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
2007 0
|
缓存 安全 网络协议
【面试-八股文】Linux高频面试题,助你吊打面试官系列
大家好,我是温大大 继上次输出【面试-八股文】mysql 万字总结,助你吊打面试官,业界反响还不错(呵呵呵) 最近温大大继续爆肝输出 姐妹篇 Linux万字总结, 从linux基础、三剑客(grep\sed\awk)、shell脚本编程、文件管理命令、磁盘管理命令、网络通讯命令、系统备份命令 以及 高频面试题角度出发的呕心力作(呵呵呵*2)
【面试-八股文】Linux高频面试题,助你吊打面试官系列
|
JavaScript 前端开发 存储
Javascript装饰器的妙用
最近新开了一个Node项目,采用TypeScript来开发,在数据库及路由管理方面用了不少的装饰器,发觉这的确是一个好东西。装饰器是一个还处于草案中的特性,目前木有直接支持该语法的环境,但是可以通过 babel 之类的进行转换为旧语法来实现效果,所以在TypeScript中,可以放心的使用@Decorator。
1465 0
|
网络安全 网络虚拟化 数据安全/隐私保护
|
2天前
|
人工智能 运维 安全
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
382 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
7天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
669 107