• 1294 全排列——http://codevs.cn/problem/1294/


    第一部分:题目

    题目描述 Description

    给出一个n, 请输出n的所有全排列

    输入描述 Input Description

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

    输出描述 Output Description

    一共n!行,每行n个用空格隔开的数,表示n的一个全排列。并且按全排列的字典序输出。

    样例输入 Sample Input

    3

    样例输出 Sample Output

    1 2 3

    1 3 2

    2 1 3

    2 3 1

    3 1 2

    3 2 1

    第二部分:思路

    全排列:就是把1~n的所有排列打印出来。那么怎么得出这些排列呢?我使用一个数组take 来接收这些数的每一次排列,相当于“插入法”。当然在插入之前需要判断当前数字是否已在数组中,不在就插入。在就继续枚举。(这里建议一点就是:能先判断就先判断,不要先调用函数再进行判断,因为函数调用比较耗时。个人习惯,不喜勿喷。嘻嘻)

    第三部分:代码

    #include<stdio.h>
    int take[10],len=0;//接收当前排列的数组,以及数组长度 
    void permutation(int n)//排列函数 
    {
        int i,j,l;
        for(i=1;i<=n;i++)//从1~n枚举 
        {
            for(j=0;j<len;j++)//判断是否已经在数组中,不在就插入 
            {
                if(i==take[j])
                {
                    break;
                }
            } 
            if(j==len)
            {
                take[len++]=i;
                permutation(n);
                if(len==n)//当数组长度等于n时,说明一次排列已经完成,打印 
                {
                    for(l=0;l<len-1;l++)
                    {
                        printf("%d ",take[l]);
                    }
                    printf("%d
    ",take[l]);
                }
                len--;//寻找写一个排列之前要被当前数组清空 
            }
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        permutation(n);
        return 0;
    }
  • 相关阅读:
    Android学习笔记(四十):Preference的使用
    怎样在小方框上打对号 小方框内打对勾 word 方框打对勾
    PreTranslateMessage作用和用法
    MyBatis与Spring设置callSettersOnNulls
    EJB3.0开发环境的搭建
    经常使用虚拟现实仿真软件总汇(zz)
    slf自己主动绑定实现类过程推断
    DLNA介绍(包含UPnP,2011/6/20 更新)
    从技术到管理的问题
    NOI第一天感想&小结
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5353905.html
Copyright © 2020-2023  润新知