acwing 842. 排列数字
题目描述
给定一个整数 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算法求解
分析
- 使用path[]保存每层选择哪个数
- 使用st[]标记每个数是不是被上面的某层使用过
代码
#include
#include
#include
using namespace std;
const int N = 10; //
int path[N]; // 用来存每层选择的数是哪个
bool st[N]; // 用来表示一个数是否被用过
int n;
// 当前是第u层 ,从第0层开始
void dfs(int u)
{
if(u == n) // 到达第n层,可以输出并返回了
{
for(int i = 0; i < n; i++ )
{
printf("%d ", path[i]);
}
puts("");
return;
}
for(int i = 1; i <= n; i++)
{
if(!st[i]) // 这个数没用过
{
path[u] = i; // 本层用i这个数
st[i] = true;
dfs(u + 1); // 递归到下一层
st[i] = false; // 恢复现场
}
}
}
int main()
{
scanf("%d", &n);
dfs(0);
return 0;
}