给定一个整数 n,将数字1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
这一个题目就是典型的dfs(深度优先搜索的模板题目)。既然是要求我们按照字典序输出排列结果,那么我们每一层的搜索都从小到大枚举元素,当搜索到最深层后就停止搜索并输出当前存储数组,然后回溯。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
bool vis[10];//构建一个布尔数组用来判断当前数字是否被之前的层数使用过
int q[10];
int n;
void dfs(int x)//dfs模板
{
if(x==n)//当深度到达最大值时就退出搜索,输出当前数组中存储的元素
{
for(int i=0;i<n;i++)
cout<<q[i]<<' ';
puts("");//换行输出
return;
}
for(int i=1;i<=n;i++)//尝试填入数据
{
if(!vis[i])//如果当前数据没有被之前的层使用过,那么就表明可以使用
{
vis[i]=true;//标记所使用过的元素
q[x]=i;//填入元素
dfs(x+1);//开启下一层搜索
vis[i]=false;//回溯,还原现场
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
这里有一个小细节就是我们在回溯还原现场的时候只是还原了布尔数组,并未还原我们用来存储结果的数组,这是因为即使我们不去刻意还原它,它也会被下一次的回溯覆盖原有的结果。