5972: 【递归入门】全排列

题目描述

排列与组合是常用的数学方法。 
先给一个正整数 ( 1 < = n < = 10 ) 
例如n=3,所有组合,并且按字典序输出: 
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1

输入

输入一个整数n(  1<=n<=10)

输出

输出所有全排列

每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格)

样例输入

3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

这是对昨天学习《算法竞赛入门经典》的复习,应用了7.2.1生成1~n的排列  递归方法。
#include<stdio.h>
int a[1000],n;

void Get_a(int n,int *a,int ans)
{
    int flag,i,j;
    if( ans == n+1)
    {
        for(i = 1; i < n; i ++)
            printf("%d ",a[i]);
        printf("%d\n",a[n]);
    }
    else
    {
        for(i = 1; i <= n; i ++)
        {
            flag = 1;
            for(j = 1; j < ans; j ++)
                if(a[j] == i) flag = 0;
            if(flag)
            {
                a[ans] = i;
                Get_a(n,a,ans+1);
            }
        }
    }
    return;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        Get_a(n,a,1);
    }
    return 0;
}
时间: 2024-10-07 15:51:13

5972: 【递归入门】全排列的相关文章

C程序设计的抽象思维-递归入门

[斐波那契序列] 序列中的每一个新项都是它前两项的和. 0    1     1     2     3      5      8       13       21       34      55       89       144  ---- 数学表达式表示序列中的一个新项:   tN = tN-1 +  tN-2 像这种类型的表达式,序列中的每一个元素都是由先前的元素来确定,这种序列称为递归关系. 斐波那契序列的完整定义如下: tn =  n       n= 0 或者 n= 1 t

Java使用递归实现全排列的代码

将写内容过程经常用到的一些内容备份一下,下边内容是关于Java使用递归实现全排列的内容. public class AllPermutation { public static void main(String[] args) { char[] source=new char[]{'A','B','C'}; char[] result=new char[source.length]; allPermutation(0,source,result); } public static void al

Problem C: 【递归入门】组合+判断素数

Description 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n). 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. Input 第一行两个整数:n , k (1<=n<=20,k&

递归之全排列问题

一.问题描述 如输入一个字符串abc,其中的元素都不一样,则根据数学知识很容易得知道它的全排列有n!=3!=6; 即abc;acb;bac;bca;cab;cba; 当然如果包含重复元素,如aab,实际的全排列是:aab;aba;baa三种,则需要剔除掉重复的情况. 这里我们就是研究如何准确无误的将其所有的排列进行统计以及显示等. 二.问题分析 对全排列问题而言,其过程可以理解为递归思想.如abc,我们先任意取一个元素如a,则对bc进行全排列,依次类推 直到最后只有一个元素全排列,即是它本身.

算法之使用递归求解全排列

在python中有一个模块叫做itertools,使用这个模块能够快速的求解排列组合问题,刚好朋友问到怎么求全排列问题,不能用内置模块去做,于是...自己想了想逻辑,使用递归实现比较简单. 下面是简单的实现代码: 1 #!/usr/bin/env python 2 # encoding:utf-8 3 # __author__: huxianglin 4 # date: 2016/9/25 12:09 5 # blog: http://huxianglin.cnblogs.com/ http:/

递归解决全排列生成算法

排列:从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)出口:如

递归入门 Java

对于强大的递归.要想做到灵活运用,是需要花时间进行练习并总结.往往递归学习的入门也是难度也比较大,常常会处于看得明,却写不出的"尴尬"情况. 递归的定义 将一个大的问题分解成比较小的.有着相同形式的问题. 递归是一种强有力的思想.在计算机科学的学习中,一个重要的必须学习的概念是递归.递归是一种编程策略,它把一个大的问题分解成具有相同形式的简单问题. 使用递归的必需条件 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式 存在一种简单情境,可以使递归在简单情境下退出 一般对递

Java用递归实现全排列,详细

package edu.cqu.algorithmTest; import java.util.Scanner; // 全排列,递归实现 public class Main8 { public static void main(String[] args) { int[] arr = { 1, 2, 3}; bfs(arr, 0, arr.length - 1); } public static void bfs(int []a,int start,int end) { /* * 递归的终点是,

递归实现全排列python

python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",string=""): if len(string)>1: for father_string in string: pailie(head+father_string,string.replace(father_string,"")) #关键一点:将头和尾全部传下去