请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a
1 ,a 2 ,⋯,a n 排在序列b 1 ,b 2 ,⋯,b n 之前,如果存在k使得a 1 =b 1 ,⋯,a k =b k 并且 a k+1
输入样例:
3
输出样例:
123
132
213
231
312
321
问题分析
递归。不能把它展开来算(千万不能深究),只能计算它的第一层,找出递归出口和特殊条件。
n个正整数的全排列,num[]= {1,2,3,4,5,6,7,8,9};
用mark[10]= {0}; 标记数字是否被选入,
int x 表示下标,设a[i]为选入的数组,
则递归出口是当x==n时,输出选入的数组a[i];
第i层计算方法:
int t=num[i];表示改层要选入的数
如果mark[t]==0,也就是这个数没有选入的时候,将数组放入a[x]数组中,
并将mark[t]=1;则此数字不能再被选入;
此后,下标x往后移,进入i+1层数字的选入;
当一次递归完成后,要释放数字,使得mark[t]=0;则下次递归时,该数字可以再被选择。
#includeusing namespace std; int n,a[10],num[]= {1,2,3,4,5,6,7,8,9}; int mark[10]= {0}; //标记 void dp(int x) { if(x==n)//递归出口 { for(int i=0; i int t=num[i]; if(mark[t]==0) { a[x]=t; mark[t]=1; dp(x+1); mark[t]=0; } } } int main() { cin>>n; dp(0); }
咱就是说,真的好难过,搞来搞去又看不懂,每天当一个又笨又懒的码农,如果只是为了考试而学习真没意思/
如果不好好读书的话,当不了齐天大圣,只能回家种地了。



