枚举排列 之 “生成1~n的排列”

一、原题

输入n之后,生成1~n的排列。

(题目来源:《算法竞赛入门经典》【刘汝佳】)

二、题目源代码

#include <stdio.h>
#define MAXN 1000
int a[MAXN][MAXN];

void print_permutation(int n,int*a,int cur)
{
    int i,j;
    if(cur==n)    //递归边界
    {
        for(i=0;i<n;i++)  printf("%d",a[i]);
        printf("\n");
    }
    else  for(i=1;i<=n;i++)    //尝试在a[cur]中填各种整数i
    {
        int ok=1;
        for(j=0;j<cur;j++)
        if(a[j]==i)  ok=0;
        if(ok)
        {
            a[cur]=i;
            print_permutation(n,a,cur+1);//递归调用
        }
    }
}
int main()
{
    int n,*a;
    scanf("%d",&n);
    print_permutation(n,a,0);
    return 0;
}

三、解题思路

1.运用递归。以1开头,以2开头,依次往后。

2.判断当前位置要输入的数 i 是否在之前已经出现过,运用标志变量ok。

四、心得体会

1.在main函数开头,要定义n,虽然前面在函数定义中已经定义了,可是函数在main函数中调用之前就用到了n.      数组a在main函数开头可以不定义。

2.注意在函数定义时对变量定义的方法。

枚举排列 之 “生成1~n的排列”

时间: 2024-10-01 21:49:59

枚举排列 之 “生成1~n的排列”的相关文章

算法竞赛入门经典_第七章 暴力求解法_7.2枚举排列:生成1~n的排列

版权所有,欢迎转载,转载请注明出处,谢谢 生成1~n的排列 递归思想:先输出所有以1开头的排列(这一步是递归调用),然后输出以2开头的排列(这一步是递归调用),接着是以3开头的排列······最后才是以n开头的排列. //vs2012测试代码 #include<iostream> using namespace std; void print_permutation(int n, int* A, int cur) { if(cur==n)//递归边界 { for(int i=0; i<n

7.2.1 生成1~n的排列(全排列)【STL__next_permutation()_的应用】

#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int a[20]; void print_permutation(int n, int a[], int

【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

leetcode排列,求第k个排列

stl 中的下一个排列在写一遍忘了 写个1个多小时,使用递归写的,错误就在我使用一个list保存当前剩下的数,然后利用k/(n-1)!的阶乘就是删除的数字,但进过观察, 比如 list={1,2,3} 分成3组: 1  {2,3} 2 {1,3} 3 {1,2} 确定位于哪个组,然后确定位于哪个组的第几个nyoj 511. 求第3个排列   ,3%2=1,删除 list就是第3个数3,其实呢是第2个树2 ,所以   计算方法为 (k-1)/(n-1)! 另外一个对于下一组,k%(n-1)!也不行

现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的

题目: 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的 据说这道题是百度校招的一道算法题,反正我觉得我在学校的时候很可能做不出来.在学校的时候真该好好学习啊,我也逃不过毕业之后再来后悔的命运.但是,我还是要说点正能量的话, 只要知道学,什么时候都不晚.至少现在我做这道题的时候没遇到太大的困难,说明毕业之后的学习还是有很大作用的.为了我喜欢的编程,为了我喜欢的算法,继续努力! 言归正传,我看到这道题的时候,原文有这道

使用TreeSet和Comparator,写TreeSetTest2 要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列

/* * 使用TreeSet和Comparator,写TreeSetTest2 *要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列, *排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列 */ import java.util.Comparator; import java.util.TreeSet; public class TreeTest2 { public static void main(String[] args) { // TODO Aut

LeetCode 笔记21 生成第k个排列

题目是这样的: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order,We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312"

排列组合生成算法

r排列生成: gen 递归层数d表示正在生成第d个元素. vis记录是否出现过. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n, r; int A[50], vis[50];//记录第i个元素是否生成过 int cnt; int rer; void output(int r) { for(int i = 0; i < r; i++) printf(

排列的生成算法

字典序法 对于按字典的顺序给出的排列(p=p(1)p(2)p(3)p(4)…p(n)),由一个排列生成下一个排列的算法如下: (1)求满足关系式p(j-1)<p(j)的j的最大值设为i,即 i=max{j|p(j-1)<p(j)} (2)求满足关系式p(i-1)<p(k)的k的最大值设为j,即 j=max{k|p(i-1)<p(k)} (3)p(i-1)与p(j)互换位置,得到p'=p(1)p(2)…p(n) (4)在p'=p(1)p(2)…p(i-1)p(i)p(i+1)…p(n