题目描述
给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
主要思想
dfs
思路
设有n个位置,从第0个开始递归,从1开始往第u个位置填,并将这个数标记为已用过(因为不能重复),然后进行递归,如果走到头了,就将这种排序进行输出(别忘了输出换行),再回溯
代码
#include<iostream>
using namespace std;
int n;
int p[13];
bool a[13];
void dfs(int u)
{
if(u==n)//如果走到头
{
for(int i=0;i<n;i++)//输出
{
cout<<p[i]<<' ';
}
cout<<endl;
return ;//返回到上一层
}
else
{
for(int i=1;i<=n;i++)
{
if(!a[i])/如果这个位置没有数字
{
p[u]=i;//填上数字
a[i]=1;//这个数字标记为1
dfs(u+1);//填下一个数字
a[i]=0;//回溯,恢复现场
}
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}