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\n",take[l]);
            }
            len--;//寻找写一个排列之前要被当前数组清空 
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    permutation(n);
    return 0;
}

 

posted @ 2016-04-05 09:50  喝醉的香锅锅  阅读(199)  评论(0编辑  收藏  举报