基本算法-枚举、模拟、递推(上)

目录

递归实现指数型枚举

题目描述

运行代码

代码思路

递归实现组合型枚举

题目描述

运行代码

代码思路

递归实现排列型枚举

题目描述

运行代码

代码思路

递归实现指数型枚举

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include<iostream>
using namespace std;
int n,a[17],m;
void p(int n)
{
    if(!n)return;
    p(n/10);
   cout<<n%10;
    return;
    }
void dfs(int i)
{
    if(i>n)
    {
        for(int j=1;j<=m;++j)
        {
            p(a[j]);
            cout<<" ";
        }
        cout<<endl;
        return;
    }
    dfs(i+1);
    a[++m]=i;
    dfs(i+1);
    m--;
    return;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

代码思路

  • p函数用于将一个整数按位输出,通过递归的方式逐位取出并输出。
  • dfs函数是深度优先搜索的主要函数。
  • 从 1 开始进行深度优先搜索,当搜索到超过给定的 n 时,就输出当前已选择的数字序列。
  • 在搜索过程中,有两种选择:一种是不选择当前数字,直接进入下一层搜索(dfs(i+1));另一种是选择当前数字,将其添加到数组 a 中(通过递增 m 并赋值),然后再进行下一层搜索(dfs(i+1)),之后再回溯(通过 m-- 恢复状态)。通过深度优先搜索生成并输出所有可能的数字组合情况。

递归实现组合型枚举

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector> 
using namespace std;
vector<int> a;
int n,m;
void dfs(int x)
{
	if( a.size() == m )
	{
		for (int i = 0; i < a.size(); i++)
		{
			cout << a[i];
			if( i != a.size() - 1 ) cout << ' ';
		}
		cout << '\n';
		return;
	}
	if( a.size() > m || a.size() + n - x + 1 < m ) 
        return;
	a.push_back(x);
	dfs(x+1);
	a.pop_back();
	dfs(x+1);
}

int main()
{
	cin >> n >> m;
	dfs(1);
	return 0;
}

代码思路

  1. 变量定义:vector<int> a; 用于存储当前搜索路径上的数字,即当前组合。

    int n, m; 分别表示可选择的数字范围(1到n)和每个组合需要的数字个数。
  2. 主函数main():读入用户输入的n和m,然后调用dfs(1)开始深度优先搜索,从数字1开始探索所有可能的组合。

  3. 函数dfs(int x):

    • 基础情况:如果当前组合a的大小等于目标组合长度m,说明已经找到一个有效的组合,这时遍历并打印a中的所有数字,然后返回。
    • 剪枝:如果当前组合的大小已经超过目标长度m,或者即使把剩下的所有数字都加入当前组合也无法达到目标长度,说明此路不通,直接返回。
    • 递归搜索:先做选择:将当前数字x加入到组合a中,然后递归调用dfs(x+1)继续搜索下一个数字。撤销选择:在递归调用返回后,从组合a中移除最后一个数字(即撤销之前的选择),然后继续尝试下一个可能的数字,即再次调用dfs(x+1)

程序能够遍历所有可能的组合,而不会重复,并且有效地跳过了不可能构成有效组合的搜索路径,这就是剪枝操作的作用,保证了算法的高效执行。

递归实现排列型枚举

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include<iostream>
#include<string>
#include<bits/stdc++.h>
using namespace std;
int n = 0;
int arr[10];
void FN(string & s) {
    if (s.size() < 2 * n) {
        for (int i = 1; i <= n; ++i) {
            if (arr[i] == 0)
                continue;
            s += to_string(i) + " ";
            arr[i] = 0;
            FN(s);
            s.pop_back();
            s.pop_back();
            arr[i] = 1;
        }
        return;
    }
    s.pop_back();
    cout << s << endl;
    s += " ";
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        arr[i] = 1;
    }
    string s;
    FN(s);
    return 0;
}

代码思路

  1. 全局变量定义:int n: 存储用户输入的整数,用于确定序列中数字的取值范围(1到n)。

    int arr[10]: 记录每个数字是否已被使用。初始化为1,表示所有数字都可以被使用。
  2. 函数FN(string &s):

    • 参数string &s 是一个引用类型字符串,用于构建当前搜索路径上的序列。
    • 基本思路:递归生成序列,当序列长度达到2*n时,输出该序列。
    • 递归条件:若s.size()小于2*n,则继续添加数字。遍历1到n之间的数字,检查当前数字是否可用(arr[i]==1)。回溯:从s中移除刚添加的数字及其尾随的空格,并恢复数字的可用状态(arr[i]=1)。递归调用FN(s)继续构建序列。若可用,则将其转换为字符串形式添加到s中,并标记该数字已使用(arr[i]=0)。
    • 输出条件:当s的长度达到2*n时,从s中移除最后一个空格,输出序列,并在序列末尾添加一个空格准备下一轮的添加(虽然这里的添加空格在最终输出时并无实际作用)。
  3. 主函数main():读取用户输入的n。初始化数组arr,允许所有数字最初都被使用。调用FN(s)开始递归生成并输出所有满足条件的序列,初始传入一个空字符串s

利用深度优先搜索遍历所有可能的序列组合,并通过数组arr跟踪每个数字的使用状态,确保序列中任意两个相邻数字不相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/690391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

netty+springboot+vue聊天室(需要了解netty)

先看看这个使用websocket实现的聊天室&#xff0c;因为前端是使用websocket&#xff0c;和下面的demo的前端差不多就不解释实现原理&#xff0c;所以建议还是看看(要是会websocket的大佬请忽略) springbootwebsocketvue聊天室 目录 一、实现内容二、代码实现1.后端2.前端源码…

Java--命令行传参

1.有时你希望运行一个程序时再传递给它消息&#xff0c;这要靠传递命令行参数给main&#xff08;&#xff09;函数实现 2.选中文件右键找到如图选项并打开 3.在文件地址下输入cmd空格符号&#xff0c;再按回车调出命令窗口 4.如图一步步进行编译&#xff0c;在向其传入参数&…

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

win10重装系统?电脑系统重装一键清晰,干货分享!

在电脑的使用过程中&#xff0c;由于各种原因&#xff0c;我们可能会遇到系统崩溃、运行缓慢或者出现各种难以解决的问题。这时&#xff0c;重装系统往往是一个有效的解决方案。今天&#xff0c;我们就来详细介绍一下如何在Win10环境下进行系统的重装&#xff0c;帮助大家轻松解…

springboot+mqtt使用总结

1.软件的选型 1.1.使用免费版EMQX 1.1.1.下载 百度搜索的目前是会打开官网&#xff0c;这里提供下免费版的使用链接EMQX使用手册 文档很详细&#xff0c;这里不再记录了。 1.2.使用rabbitmq rabbitmq一般做消息队列用&#xff0c;作为mqtt用我没有找到详细资料&#xff0c…

[AIGC] SpringBoot的自动配置解析

下面是一篇关于SpringBoot自动配置的文章&#xff0c;里面包含了一个简单的示例来解释自动配置的原理。 SpringBoot的自动配置解析 Spring Boot是Spring的一个子项目&#xff0c;用于快速开发应用程序。它主要是简化新Spring应用的初始建立以及开发过程。其中&#xff0c;自动…

武汉理工大学 云计算与服务计算 期末复习

云计算与的定义 长定义是&#xff1a;“云计算是一种商业计算模型。它将计算任务分布在大量计算机构成的资源池上&#xff0c;使各种应用系统能够根据需要获取计算力、存储空间和信息服务。” 短定义是&#xff1a;“云计算是通过网络按需提供可动态伸缩的廉价计算服务。 云计…

批量转换更高效:一键修改TXT后缀名转DOCX,轻松实现文件高效管理!

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;而文件格式的转换和管理往往是其中一项繁琐的任务。特别是当需要将大量的TXT文件转换为DOCX格式时&#xff0c;传统的逐个手动操作不仅效率低下&#xff0c;还容易出错。然而&#xff0c;现在有了我们这款…

【ArcGIS微课1000例】0117:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

在线渲染3d怎么用?3d快速渲染步骤设置

在线渲染3D模型是一种高效的技术&#xff0c;它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力&#xff0c;从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果&#xff0c;在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是&#xff1a;云渲染…

数据结构之初识泛型

目录&#xff1a; 一.什么是泛型 二.引出泛型 三.泛型语法及&#xff0c;泛型类的使用和裸类型(Raw Type) 的了解 . 四.泛型的编译&#xff1a; 五.泛型的上界 六.泛型方法 注意&#xff1a;在看泛型之前可以&#xff0c;回顾一下&#xff0c;包装类&#xff0c;包装类就是服务…

【Python预处理系列】深入理解过采样技术及其Python实现

目录 一、过采样简介 二、过采样的实现方法 三、过采样和欠采样是数据增强吗 四、Python实现SMOTE过采样 &#xff08;一) 生成不平衡数据集 &#xff08;二&#xff09; 将数据集转换为DataFrame&#xff0c;便于展示 &#xff08;三) 应用SMOTE算法进行过采样 &…

命令行打包最简单的android项目从零开始到最终apk文件

准备好需要的工具 AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 jdk的链接我就不发出来,自己选择,我接下来用的是8版本的jdk和android10的sdk sdk的安装和环境变量的配置 sdk tool压缩包打开后是这样子,打开sdk mana…

3-1RT-Thread时钟管理

这里写自定义目录标题 时钟节拍是RT thread操作系统的最小时间单位。 第一个功能&#xff0c;rt tick值自动加1&#xff0c;在RT thread当中通过RT_USING_SMP定义了多核和单核的场景。第二个功能&#xff0c;检查当前线程的时间片&#xff0c;首先获取当前线程&#xff0c;将当…

[数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;761 标注数量(xml文件个数)&#xff1a;761 标注数量(txt文件个数)&#xff1a;761 标注类别…

【Text2SQL 论文】PET-SQL:用 Cross-Consistency 的 prompt 增强的两阶段 Text2SQL 框架

论文&#xff1a;PET-SQL: A Prompt-enhanced Two-stage Text-to-SQL Framework with Cross-consistency ⭐⭐⭐ arXiv:2403.09732&#xff0c;商汤 & 北大 Code&#xff1a;GitHub 一、论文速读 论文一开始提出了以往 prompt-based 的 Text2SQL 方法的一些缺点&#xff1…

Linux卸载残留MySQL【带图文命令巨详细】

Linux卸载残留MySQL 1、检查残留mysql2、检查并删除残留mysql依赖3、检查是否自带mariadb库 1、检查残留mysql 如果残留mysql组件&#xff0c;使用命令 rpm -e --nodeps 残留组件名 按顺序进行移除操作 #检查系统是否残留过mysql rpm -qa | grep mysql2、检查并删除残留mysql…

[职场] 关于薪酬需要知道的两个知识点 #知识分享#知识分享

关于薪酬需要知道的两个知识点 薪酬问题是面试过程中比较核心的问题&#xff0c;也是每次面试必问的。如果你进入到面试的后一阶段&#xff0c;这类问题可以让面试官或企业判断求职者的要求是否符合企业的薪酬标准&#xff0c;并进一步判断求职者对自身价值的认可程度。关于薪…

设计模式-六大原则

概述 设计模式体现的是软件设计的思想&#xff0c;而不是软件技术&#xff0c;它重在使用接口与抽象类来解决各种问题。在使用这些设计模式时&#xff0c;应该首先遵守六大原则。 原则含义具体方法开闭原则对扩展开放&#xff0c;对修改关闭多使用抽象类和接口里氏代换原则基…