输出1-n的全排(递归C++)

【问题描述】

输出1到n之间所有不重复的排列,即1到n的全排,要求所产生的任一数列不含有重复的数字.

【代码展示】

#include<iostream>
using namespace std;
int a[100],b[100];
void quanpai(int index,int n){
  //递归边界
  if(index==n+1){
    for(int i=1;i<=n;i++){
      cout << a[i];
    }
    cout << endl;
    return;
  }
  //向数组添加数据(123->132)
  for(int i=1;i<=n;i++){
    if(b[i]==0){
      a[index]=i;
      b[i]=1;
      quanpai(index+1,n);
      b[i]=0;
    }

  }
}
int main(){
  int n;
  cin >> n;
  quanpai(1,n);
  return 0;
}

原文地址:https://www.cnblogs.com/dongks/p/10306673.html

时间: 2024-11-07 03:43:17

输出1-n的全排(递归C++)的相关文章

关于全排的递归算法

注:该方法转自 李宁的极客世界 在做leetcode的时候遇到一道关于全排的题,于是去了解了有关的递归算法 思路: 1.首先看最后两个数4, 5. 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列. 由于一个数的全排列就是其本身,从而得到以上结果. 2.再看后三个数3, 4, 5.它们的全排列为3 4 5.3 5 4. 4 3 5. 4 5 3. 5 3 4. 5 4 3 六组数. 即以3开头的和4,5的全排列的组合.以4开头的和3,5的全排列的组合和以5开头的和3,

算法习题---字符串的全排序列

一:什么是全排列 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 二:全排列实现思路 (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀):

lua解上阶梯问题(按指定格式输出具体走法、迭代、递归)

问题描述 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法. 思路 注释均在代码中 其它 第一次接触lua,很好的脚本语言 源代码 --[[-------------------------------------------------------------------------- 表复制:深复制 --]]-------------------------------------------------------------------------- func

N个数的全排列 -------指定排头法

输入 一个整数N  再输入N个整数 输出 N个数的全排 代码如下: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 100 4 5 int a[2][N] = {0}; 6 int p[N] = {0}; 7 8 void dfs(int k, int n) 9 { 10 int i; 11 12 if(k == n) 13 { 14 for(i = 0; i < n - 1; i++) 15 printf("

递归基础—组合数 / 排列数—输出的各种办法(dfs/递归/bfs)

B: 部分和问题***(注意部分和 ! = 任意子区间求和不一样) 描述   给你N个数,问你能不能从其中取出一些,让它们的和为K. 输入 第一行包括两个数,N,K,分别代表数字个数,以及和为K. 接下来N行,每行一个数字. 输出 如果能选出一些数和为K, 输出YE5,  否则,输出N0 样例 输入: 4 0 1 -1  2  3 输出: YE5 输入: 2 2 1 -3 输出: N0 本题求组合数和,注意pe之外,思维比较基础,办法很多,以下为利用dfs思想实现的一种办法 如果求组合数输出各种

递归深度实战

先不说理论,先来个简单的递归小例子感受一下: 字符串的反转: #include <stdio.h> //递归字符串反转 void reverse(char* s) { if( (s != NULL) && (*s != '\0') ) { reverse(s + 1); printf("%c", *s); } } int main(int argc, char *argv[]) { reverse("12345"); printf(&qu

递归解决全排列生成算法

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 方法一: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如

递归讨论(三)

递归对于编程者来说,是比较难理解的,但当你完全清晰程序思路时,它会变得容易理解了. 递归思想成为解决一些编程难题所常用的,所以多多练习,多多理解它,会让我们对之爱不释手,作为初学者的我,每当理解如何递归的解决问题时,就会非常开心,这也许就是挑战所带来的成就感,所学即所得的满足感吧. 下面以如下一道例题为例吧: 在数据结构(c语言版)一书中,页码p8,有如下一题 问题1:<全排列>对给定的n个元素的集合,输出该集合所有可能的排列: 我们对比着看下面一道问题,可以先思考思考: 问题2:<全排

算法设计-全排列递归

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如果只有一个