第一部分:题目
题目描述 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; }