例题描述
给定一个整数 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
参考代码(C++版本)
#include <iostream>
using namespace std;
int n;
const int N = 10;
int path[N];//存放dfs时,路径上的值
bool st[N];//记录当前这个位置的状态,用于判断是否被用过
void dfs(int u)
{
//u已经递归到最终的n这层,表示已经对前n个位置部署好了相应的数字,属于搜索完成的情况,此时可以输出这条路径中存的值
if(u == n)
{
for(int i = 0; i < n;i++) cout << path[i]<<' ';
cout << endl;
return;
}
for(int i = 1; i <= n;i++)
{
//判断当前这个值有没有用过
if(!st[i])
{
path[u] = i;//把这个数存到路径数组中
st[i] = true;//标记这个数已经用过了
dfs(u+1);//第u个位置的数据已经部署好了,现在需要走到下一个位置去部署数据
st[i] = false;//结束递归,回溯,恢复现场
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
问题剖析
什么是深度优先遍历(DFS)
DFS —— 不撞南墙不回头的执著boy