1.问题描述:
AcWing 824 排列数字
给定一个整数 n,将数字 1∼n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 nn。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7;
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
2.解决方法:首先创建两个数组out[]和tra[],out数组用于存放可以被选择最后进行输出的数字,tra数组作为一个标记数组,(0表示该数字没被选择,1表示该数字已经被选择了)用于对每个数字进行监视,看这个数字是否已经被用过。dfs算法包含递归的调用,递归函数包含递归出口和递归体,当一组数字循环完毕之后需要进行回溯,(比如说一共有1,2,3三个数进行全排列,加入第一个数选择1,第二个数选择2,第三个数字就是3,但这只是第一组,只是最终答案的一部分,因此我们需要进行回溯,将tra标志位设置为0,这样选择完1之后的第二个数字就可以有(2.3)两种选择,同理可得第一个数字也有(1,2,3)三种选择)。
#include<iostream>
using namespace std;
const int N=1e+5;
int n;
int out[50];
int tra[5];//0表示手里有,1表示手里没有
void dfs(int step)
{
if(step==n+1)
{
for(int i=1;i<=n;i++)
{
cout<<out[i]<<" ";
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(!tra[i])
{
out[step] = i;
tra[i] = 1;
dfs(step+1);//进入第二个数的选择
tra[i] = 0;
}
}
}
int main()
{
cin>>n;
dfs(1);//从第一个开始遍历
return 0;
}