当前位置: 首页 > news >正文

【普及−】洛谷P1706 全排列问题

见:P1706 全排列问题 - 洛谷

题目描述

按照字典序输出自然数 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。

算法解析

DFS,

对楼上的回溯+剪枝进行详解。

我们以N=3为例,

构造一棵搜索树(或说是状态树)来进行搜索。

同时构造出三个格子,

用来存放搜索树中的结果。

现在,我们从第一格开始搜索。

第一格填1的搜索树如下:

所以N=3的情况下,

第一格填1的排列情况共有两种123,132.

第一格填2的搜索树如下:

所以N=3的情况下,

第一格填2的排列情况共有两种 213,231.

如果你看懂了,

请你自己画画第一格填3的搜索树。

程序实现

我们总结一下在上一部分中的思路在程序中如何实现。

先定义两个数组,

一个是用来存放解的,

一个是用来标记该数是否用过。

接下来就是写深搜的函数了。

主要思路:

先判断格子是否填满了,

如果填满,

则print()一下。

如果没有填满,

则开始循环,

在循环中先判断当前填的数是否用过,

如果没有,

则填入,

搜索下一格。

程序实现如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long//十年OI一场空,不开long long见祖宗
const int maxn=10;
int a[maxn];
int t[maxn];
int n;void dfs(int k){if(k==n+1){for(int i=1;i<=n;i++){cout<<"    "<<a[i];}cout<<endl;return;}for(int i=1;i<=n;i++){if(t[i]==0){a[k]=i;t[i]=1;dfs(k+1);t[i]=0;}		}return;
}signed main() {	cin>>n;dfs(1);return 0;
}

三连一下吧

欢迎评论

http://www.xdnf.cn/news/687493.html

相关文章:

  • java每日精进 5.28【幂等性】
  • 2025年05月28日Github流行趋势
  • uniapp-商城-74-shop(7-商品列表,选规格 添加商品到购物车)
  • 前端面试准备-1
  • Linux中的权限概念
  • Java SE Cloneable接口和深/浅拷贝
  • 水域应急救援可视化平台
  • 【前端】Vue3+elementui+ts,TypeScript Promise<string>转string错误解析,习惯性请出DeepSeek来解答
  • 国产SOC有哪些?
  • 即插即用的全新算法改进策略——引导学习策略:一种用于元启发式算法设计和改进的新型更新机制
  • Unity对象池插件Lean Pool学习笔记
  • android 图片背景毛玻璃效果实现
  • Flutter 与 Android 原生布局组件对照表(完整版)
  • TencentOSTiny
  • 【模型显著性分析】配对样本 t 检验
  • 虚拟与现实时空认知同步的核心指标
  • maven中的maven-resources-plugin插件详解
  • 部署LVS-DR群集
  • Docker部署Spark大数据组件:配置log4j日志
  • Vue开发系列——零基础HTML引入 Vue.js 实现页面之间传参
  • Kotlin 中的数据类型有隐式转换吗?为什么?
  • 天津工作机会:技术文档工程师 - 华海清科股份有限公司
  • 【Linux】分页式存储管理:深刻理解页表映射
  • 【Doris基础】Apache Doris 基本架构深度解析:从存储到查询的完整技术演进
  • 金砖国家人工智能高级别论坛在巴西召开,华院计算应邀出席并发表主题演讲
  • 960g轻薄本,把科技塞进巧克力盒子
  • 从零开始学安全:服务器被入侵后的自救指南
  • 第二章 1.5 数据采集安全风险防范之数据采集安全管理
  • git和gitee的常用语句命令
  • JS语言基础