每日c/c++题 备战蓝桥杯(全排列问题)

news/2025/4/2 8:23:00/

题目描述

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n。

输出格式

由 1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 个场宽。

输入输出样例

输入 #1

3

输出 #1

    1    2    31    3    22    1    32    3    13    1    23    2    1

说明/提示

1≤n≤9。

解题思路

问题分析

全排列问题是一个经典的递归问题。我们需要生成 1 到 n 的所有排列,且每个排列中的数字不能重复。为了实现这一点,可以使用深度优先搜索(DFS)算法,通过回溯法逐步构建排列。

思路解析

1. **DFS(深度优先搜索)**:
   - 使用 DFS 逐步构建排列,每次选择一个未使用的数字加入当前排列。
   - 当排列的长度 n达到 时,输出该排列。

2. **回溯法**:
   - 在每次递归调用中,标记当前选择的数字为已使用(`hx[i] = 1`)。
   - 递归完成后,回溯并取消标记(`hx[i] = 0`),以便尝试其他可能的排列。

3. **标记数组**:
   - 使用一个标记数组 `hx` 来记录每个数字是否已经被使用,避免重复选择。

算法步骤

1. 初始化一个标记数组 `hx`,用于记录每个数字是否被使用。
2. 定义一个递归函数 `dfs(x)`,其中 `x` 表示当前排列的长度。
3. 在递归函数中:
   - 如果 `x` 等于 n,说明已经生成了一个完整的排列,输出该排列。
   - 否则,遍历所有可能的数字(1 到 n),选择未使用的数字加入当前排列,并递归调用 `dfs(x+1)`。
   - 递归返回后,取消标记,以便尝试其他数字。

代码实现

#include<bits/stdc++.h>
using namespace std;
int n;
int d[15]={0};
int hx[15]={0};
void dfs(int x)
{if(x == n) //可以输出{for(int i=0;i<n;++i)printf("%5d",d[i]);printf("\n");} for(int i=0;i<n;++i){if(hx[i] == 0){hx[i] = 1;d[x] = i + 1; dfs(x+1);hx[i] = 0;}}
}
int main()
{cin>>n;dfs(0);return 0;
}

总结

这道题目是一个典型的全排列问题,使用 DFS 和回溯法可以高效地生成所有排列。通过标记数组避免重复选择数字,确保生成的排列符合要求。DFS 的递归结构清晰,适合解决类似的问题。


http://www.ppmy.cn/news/1584597.html

相关文章

端侧设备(如路由器、家庭网关、边缘计算盒子、工业网关等)的典型系统、硬件配置和内存大小

🏠 家用/工业级边缘设备硬件概览 类型常见设备示例CPU 架构内存范围操作系统类型家用路由器TP-Link、小米、华硕、OpenWrtARM Cortex-A7/A964MB~256MBOpenWrt / DD-WRT / Embedded Linux智能家庭网关华为、绿米、天猫精灵、Aqara HubARM Cortex-M/R128MB~512MBEmbedded Lin…

P1091 [NOIP 2004 提高组] 合唱队形

题目链接&#xff1a; 思路&#xff1a; 题目意思&#xff0c;找出最少的同学出列&#xff0c;保证学生 1-t 上升&#xff0c; t-n 下降。我们只要求出每个点的最长上升子序列和最长不上升子序列&#xff0c;然后总人数-最长上升子序列和最长不上升子序列1&#xff0c;就是最少…

在 RK3588 多线程推理 YOLO 时,同时开启硬件解码和 RGA 加速的性能分析

一、前言 本文是基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计项目的延申与拓展&#xff0c;单独分析所提出的方案4的性能和加速原理&#xff0c;即同时开启 RKmpp 硬件视频解码和 RGA 硬件图像缩放、旋转。 二、实验结果回顾 在项目的总览篇中&#xff0c;给出了该方案…

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误 环境设置 操作系统: macOS硬件平台: M1 Pro前端框架: Vue 3Node.js 版本: 20 在使用 Vue 项目时&#xff0c;我们尝试集成 vite-plugin-top-level-await 插件以支持顶层 await 语法。然而&#xff…

鸿蒙 ArkUI 应用上架流程

将鸿蒙 ArkUI 应用上架至 华为应用市场 (AppGallery) 需要完成一系列步骤&#xff0c;包括应用开发、测试、签名、打包和提交审核。本文将介绍鸿蒙应用上架的完整流程。 1. 注册华为开发者账号 访问 华为开发者联盟选择 个人 或 企业 账号注册通过身份验证&#xff08;企业账号…

Redis6数据结构之String类型

redis的String类型是存储字符串类型的key-value。 应用场景&#xff1a;验证码、计数器&#xff08;包括点赞数、文章/视频浏览数&#xff09;、订单重复提交、用户登录信息、商品详情。 常用命令&#xff1a; set/get设置和获取key-valuemset/mget批量设置或获取多个key的…

《白帽子讲 Web 安全》之开发语言安全深度解读

目录 引言 1.PHP 安全 1.1变量覆盖 1.2空字节问题 1.3弱类型 1.4反序列化 1.5安全配置 2Java 安全 2.1Security Manager 2.2反射 2.3反序列化 3Python 安全 3.1反序列化 3.2代码保护 4.JavaScript 安全 4.1第三方 JavaScript 资源 4.2JavaScript 框架 5.Node.…

C++中的特殊类设计方法与类型转换

一、特殊类设计方法 1.1设计一个类&#xff1a;不能被拷贝 例如ostream等类&#xff0c;因为缓冲区等缘故进行拷贝消耗极大 做法&#xff1a; C98&#xff1a;将拷贝构造和赋值重载设置为private&#xff0c;声明但不实现 C11&#xff1a;直接把拷贝构造和赋值重载delete …