请编写程序输出前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;则下次递归时,该数字可以再被选择。
#include
using 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<n; i++)
cout<<a[i];
cout<<endl;
return ;
}
for(int i=0; i<n; 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);
}
咱就是说,真的好难过,搞来搞去又看不懂,每天当一个又笨又懒的码农,如果只是为了考试而学习真没意思/
如果不好好读书的话,当不了齐天大圣,只能回家种地了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)