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

目录

递归实现指数型枚举

题目描述

运行代码

代码思路

递归实现组合型枚举

题目描述

运行代码

代码思路

递归实现排列型枚举

题目描述

运行代码

代码思路

递归实现指数型枚举

题目描述

登录—专业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.mzph.cn/news/850104.shtml

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

相关文章

数据结构篇其六-串

数据结构—串 前置说明 由于学习Java面向对象语言走火入魔&#xff0c;试图在C语言中模拟实现面向对象设计。里面加入了大量的函数指针配合结构体来模拟类中的成员方法 故此篇&#xff0c;亦可称: 面向对象的C语言程序设计 用C语言实现串这种数据结构&#xff0c;并将它应用到…

运动会信息管理系统(Springboot+MySQL)

本课题旨在实现对运动会信息的全面管理&#xff0c;提供用户友好的界面和高效的操作体验。系统的基础功能包括运动员报名比赛、比赛成绩查询、资讯留言等。为了确保系统的高扩展性和稳定性&#xff0c;选用主流的开发技术&#xff0c;实现规范的项目结构和高效的性能。 技术选型…

算法—字符串操作

394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string longestCommonPrefix(vector<string>& strs) { string retstrs[0];//***1***记得先要初始化ret&#xff0c;作为第一个比较值for(int i0;i<strs.size();i){retfoundcom…

Zookeeper 详解:分布式协调服务的核心概念与实践

Zookeeper 详解&#xff1a;分布式协调服务的核心概念与实践 Apache Zookeeper 是一个分布式协调服务&#xff0c;广泛用于分布式应用程序的配置管理、服务发现、集群管理等。它提供了简单的分布式锁服务和命名服务&#xff0c;使开发者能够更加方便地构建高可靠性、高可用性的…

在 Windows 资源管理器中打开 FTP 站点终极解决方法 ftp打开方式更改为资源管理器

日常工作中&#xff0c;经常会用到FTP&#xff0c;一般情况下&#xff0c;FTP站点在IE中&#xff08;尤其是IE7以后版本&#xff09;打开&#xff0c;默认都不是以文件夹视图方式打开的&#xff0c;这时IE也会给你提示“若要在 Windows 资源管理器中查看此 FTP 站点&#xff0c…

Vue Router——hash模式和 history模式

在 Vue.js 中&#xff0c;Vue Router 是官方提供的路由管理器&#xff0c;它允许你以单页面应用&#xff08;SPA&#xff09;的方式构建你的Vue应用。Vue Router 支持两种路由模式&#xff1a;hash 模式和 history 模式。这两种模式的主要区别在于它们如何与浏览器的历史记录&a…

鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 当今信息技术领域日新月异&#xff0c;各种新技术和新平台层出不穷。鸿蒙&#xff08;HarmonyOS&#xff09;、Flutter、以及车载应用开发…

使用 Scapy 库编写 ICMP 不可达攻击脚本

一、介绍 ICMP不可达攻击是一种利用ICMP&#xff08;Internet Control Message Protocol&#xff09;不可达消息来干扰或中断目标系统的网络通信的攻击类型。通过发送伪造的ICMP不可达消息&#xff0c;攻击者可以诱使目标系统认为某些网络路径或主机不可达&#xff0c;从而导致…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

《数据库原理与应用》

计算题 设有关系模式R(ABCDEF),F={ A→BC,CD→E,B→DA }1)求R的所有候选码。2)R最高属于第几范式 AE,BE 三个关系如下:教学管理系统包括下面3个表:Students (Sno, Sname, Sex, Birthday, Enrollyear, Speciality, Dno) Courses (Cno, Cname, Period, Credit) SC (…

二叉树及其在C语言中的实现A

一、引言 二叉树是数据结构中一种非常基础且重要的树形结构&#xff0c;它的每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树在计算机科学中有着广泛的应用&#xff0c;如搜索、排序、存储数据等。本文将详细介绍二叉树的基本概念、特性以及在C语言…

Linux: ubi rootfs 故障案例 (1)

文章目录 1. 前言2. ubi rootfs 故障现场3. 故障分析与解决4. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. ubi rootfs 故障现场 问题故障内核日志如下&#xff1a; Starting ker…

elasticsearch安装与使用(2)-基于term匹配的简单搜索引擎搭建

把一篇pdf论文解析后&#xff0c;放入es数据库中&#xff0c;建立倒排索引表&#xff0c;并实现简单搜索。 1、pdf论文解析(英文) 安装pdf解析包 pip install pdfminer.sixdef extract_text_from_pdf(filename, page_numbersNone, min_line_length1):从pdf文件中提取文字:pa…

btstack协议栈实战篇--GAP Link Key Management

btstack协议栈---总目录-CSDN博客 目录 1.GAP 链接密钥逻辑 2.蓝牙逻辑 3.主应用程序设置 4.log信息 展示了如何遍历存储在 NVS 中的经典链接密钥&#xff0c;链接密钥是每个设备-设备绑定的。如果蓝牙控制器可以交换&#xff0c;例如在桌面系统上&#xff0c;则每个控制器都需…

App UI 风格,引领时尚

App UI 风格&#xff0c;引领时尚

R语言探索与分析18-基于时间序列的汇率预测

一、研究背景与意义 汇率是指两个国家之间的货币兑换比率&#xff0c;而且在国家与国家的经济交流有着举足轻重的作用。随着经济全球化的不断深入&#xff0c;在整个全球经济体中&#xff0c;汇率还是一个评估国家与国家之间的经济状况和发展水平的一个风向标。汇率的变动会对…

【前端】响应式布局笔记——媒体查询

一、媒体查询 为不同尺寸的屏幕设定不同的css样式&#xff08;常用于移动端&#xff09;。 案例1 <style>.content{width: 400px;height: 400px;border: 1px solid;}media screen and (min-device-width:200px) and (min-device-width:300px) {.content{background: r…

Linux基础指令文件管理003

本章讲述如何查看文件以及修改权限。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 查看文件&#xff1a; 指令cat [rootlocalhost a]# cat 1.txt 123 [rootlocalhost a]# 指令less [rootlocalhost a]# less 1.txt 123 ~ ~ ~ ~ ~ ~ ~ ~指令more [rootloc…

用户价值模型-RFM模型

一、RFM模型是什么 说到用户价值模型&#xff0c;我们常常会用的就是&#xff0c;RFM用户价值模型&#xff0c;它是一种常用于客户分析和营销策略制定的模型。 RFM代表的意思是&#xff1a; 1&#xff09;R(Recency)&#xff1a;最近一次购买时间&#xff0c;也就是客户最近一…

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…