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

news2024/11/29 10:55:33

目录

递归实现指数型枚举

题目描述

运行代码

代码思路

递归实现组合型枚举

题目描述

运行代码

代码思路

递归实现排列型枚举

题目描述

运行代码

代码思路

递归实现指数型枚举

题目描述

登录—专业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跟踪每个数字的使用状态,确保序列中任意两个相邻数字不相同。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java装饰器模式,装饰器模式通常通过创建一个接口和一个或多个实现了该接口的类来开始,然后创建装饰器类,这些类也实现了相同的接口

1、定义一个接口Component public interface Component { void operation(); }2、创建一个实现了Component接口的简单类SimpleComponent public class SimpleComponent implements Component { Override public void operation() { System.out.println("SimpleCom…

【JS重点知识05】正则表达式

本文章目标&#xff1a;学习正则表达式概念及语法&#xff0c;编写简单的正则表达式实现字符查找或检测&#xff1b; 一&#xff1a;正则表达式简介 1 什么是正则表达式 是用于匹配字符串中字符组合的模式。在JS中&#xff0c;正则表达式也是对象 2 正则表达式作用 表单验…

【C#】WinForm关闭新(二级)界面使主程序关闭

参考视频&#xff1a;https://www.bilibili.com/video/BV1JY4y1G7jo?p14&vd_source1c57ab1b2e551da5b65c0dfb0f05a493 1.背景介绍 主程序界面&#xff0c;点击弹出二级界面&#xff08;同时隐藏主界面&#xff09;&#xff0c;不做任何设置&#xff0c;这时关闭二级界面…

FM1202,FM020和利时备品

FM1202,FM020和利时备品,统硬件设备、数据库、控制算法、图形、报表&#xff09;和相关系统参数的设置。对整个系统进行监视和控制。操作员站主要完成以下FM1202,FM020和利时备品,各种监视信息的显示、查询和打印&#xff0c;主要有工艺流程图显示、趋势显示、参数列表显示、报…

将二叉排序树转换成双向链表--c++【做题记录】

【问题描述】 编写程序在不增加结点的情况下&#xff0c;将二叉排序树转换成有序双向链表&#xff08;如下图&#xff09;。 链表创建结束后&#xff0c;按照从前往后的顺序输出链表中结点的内容。 【输入输出】 【输入形式】 第一行输入数字n&#xff0c;第二行输入n个整数…

【CS.SE】浅谈: 程序员的职业素养与成长之路

文章目录 1 引言2 持续学习与自我提升2.1 永无止境的学习之路2.2 真实案例&#xff1a;自学Python 3 团队合作与沟通能力3.1 高效沟通是团队成功的基石 4 责任心与职业道德4.1 责任心&#xff1a;代码背后的承诺4.2 真实案例&#xff1a;修复紧急Bug 5 适应变化与快速反应5.1 适…

Linux安装MySQL教程【带图文命令巨详细】

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

用Python代码锁定Excel单元格以及行和列

Excel能够帮助用户高效地组织数据&#xff0c;还支持复杂的公式计算和数据分析。而随着团队协作的日益频繁&#xff0c;保护数据的准确性和完整性变得尤为重要。在Excel表格中&#xff0c;我们可以通过锁定特定的单元格或区域&#xff0c;防止对单元格内容进行随意修改&#xf…

2024年全国大学生数据统计与分析竞赛B题论文和代码:电信银行卡诈骗检测数据分析和机器学习模型构建

2024年全国大学生数据统计与分析竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#x…

人工智能--Foxmail邮箱使用方法

目录 &#x1f349;Foxmail全面指南 &#x1f349;下载与安装 &#x1f348;下载软件 &#x1f348;安装软件 &#x1f349;配置邮箱 &#x1f348;启动 Foxmail &#x1f348;添加邮箱账户 &#x1f348;手动配置邮箱 &#x1f34d;接收邮件服务器 (IMAP/POP3) &…

亘古真知

目录 一&#xff0c;概述 二&#xff0c;个人面板 三&#xff0c;科技面板 四&#xff0c;手牌 五&#xff0c;回合 1&#xff0c;行动 &#xff08;1&#xff09;打造 &#xff08;2&#xff09;学习 &#xff08;3&#xff09;归档 &#xff08;4&#xff09;挖掘 …

麒麟操作系统运维工程师(KYCP)课程,实现职业突破

在IT行业中&#xff0c;掌握先进的技能和知识是实现职业突破的关键。如果你希望在麒麟操作系统上成为一名卓越的运维工程师&#xff0c;那么麒麟操作系统运维工程师&#xff08;KYCP&#xff09;课程将是你的理想全面提升学员在麒麟操作系统环境下的运维能力。课程内容涵盖安全…

如何提高网站访问量?

提高网站访问量通常需要一个多方面的策略&#xff0c;涉及SEO、内容营销、社交媒体和其他网络营销手段&#xff0c;而我们仅从seo入手来说说 关键词优化是SEO的核心&#xff0c;它确保网站能够针对潜在用户的搜索查询进行优化。这不仅涉及在网站内容中使用正确的关键词 还需要…

Lua移植到标准ANSI C环境

本文目录 1、引言2、环境准备2.1 源码下载2.2 项目构建环境准备 3、项目编译3.1 添加main.c3.2 Kconfig选择模块3.3 项目构建3.4 项目编译 4、运行 文章对应视频教程&#xff1a; 在下方喔 ~~~ 欢迎关注 点击图片或链接访问我的B站主页~~~ lau解释器移植与功能验证 1、引言 本…

探索LLM 在金融领域有哪些潜在应用——通过使用 GPT-4 测试金融工程、市场预测和风险管理等 11 项任务

概述 近年来&#xff0c;用于自然语言理解和生成的人工智能技术在自然语言处理领域取得了突破性进展&#xff0c;OpenAI 的 GPT 和其他大规模语言模型在该领域取得了显著进步。这些模型通过先进的计算能力和算法&#xff0c;展示了处理复杂任务的能力&#xff0c;如理解复杂语…

安装vs2022低版本

https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history#updating-your-installation-to-a-specific-release 参考https://www.cnblogs.com/bodong/p/18084619

Sketch文件轻松转换为PSD的简便方法

由于Sketch只支持在Mac上使用&#xff0c;当设计师使用Sketch完成设计草案&#xff0c;需要与使用Windows的同事连接设计项目时&#xff0c;会遇到同事无法打开或在Photoshop中查看和编辑的情况&#xff0c;这真的很尴尬。别担心&#xff01;在本文中&#xff0c;我们将分享Ske…

计算机网络--物理层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 基本概念 物理层的概念&#xff1a;物理层解决如何在在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输…

生气时,你的“心”会发生什么变化?孟德尔随机化分析猛如虎,结果都是套路...

“不生气不生气&#xff0c;气出病来无人替”&#xff0c;不少人遇事常这样宽慰自己。事实上&#xff0c;“气死”真不是危言耸听。越来越多的研究证明了情绪稳定对健康的重要性&#xff0c;那么&#xff0c;当情绪频繁波动时&#xff0c;我们的心血管究竟会发生什么变化&#…

老师如何制作高考后志愿填报信息采集系统?

高考结束后&#xff0c;志愿填报成为学生们的头等大事。面对众多选择&#xff0c;如何高效、准确地填报志愿&#xff0c;是每个学生和家长都关心的问题。作为老师&#xff0c;能否利用现有的技术工具&#xff0c;帮助学生更好地完成志愿填报呢&#xff1f; 老师们需要一个能够…