题目描述
按照字典序输出自然数 1到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
样例输入
3
输出格式
由 1-n成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
提示 数据范围
1<=n<=9
1.分析:于给定的序列,假设序列中 N个元素,对其进行全排列之后我们可以得到的排序数量为 N!
2.每个数字保留 5个场宽,可以使用
cout << setw(5) << a[i];
注意!输出占 5个场宽的数a[i],需要头文件
iomanip
。
或者
printf("%5d",a[i]);
3.代码
1.头文件
#include<iostream>
using namespace std;
int flag[25],ans[25],n,sum=0;
2.递归
(1):定类型 定参数
void dg(int t)
(2)定边界
if(t==n+1)
(3):递归完整代码
void dg(int t)
{
int i;
if(t==n+1)
{
for(i=1;i<=n;i++)//输出
{
cout<<setw(5)<<a[i];//输出5位场宽和数
}
cout<<endl;//换行
return ;
}
for(i=1;i<=n;i++)
{
if(flag[i]==0)
{
ans[t]=i;
flag[i]=1; //计数,用过的数字不能再用
dg(t+1); //到下一层
ans[t]=0; //清零
flag[i]=0; //清零
}
}
}
3.完整代码
#include<iostream>
using namespace std;
int flag[25],ans[25],n,sum=0;
void dg(int t)
{
int i;
if(t==n+1)
{
for(i=1;i<=n;i++)//输出
{
cout<<setw(5)<<a[i];//输出5位场宽和数
}
cout<<endl;//换行
return ;
}
for(i=1;i<=n;i++)
{
if(flag[i]==0)
{
ans[t]=i;
flag[i]=1; //计数,用过的数字不能再用
dg(t+1); //到下一层
ans[t]=0; //清零
flag[i]=0; //清零
}
}
}
int main()
{
cin>>n; //输入一个数(n<10)
dg(1); //递归第一层
return 0;
}