【题目描述】求出1~n的全排列,每个数字只能用1次
【输入格式】给出数字n
【输出格式】将全排序输出并且每一次排序需要换行
[数据范围】
1≤n≤9
【算法思想】
我们可以假设有n个空盒子
然后我们要将1-n这n个数字填放到盒子中
按照顺序来,由第一个盒子开始走起
每放置完一个盒子就跑到下一个盒子那里去
我们用step这个字母来记录盒子的位置序号
那么很明显就可以推出一个边界条件:
当step == n+1的时候,代表前n个盒子已经全部填充放置完毕,此时可以输出
并且全排序中每一个数字只能用一遍,因此我们可以创建一个数组book【N】用于标记该数字是否用过,只有在没有用过的条件下我们才可以将该数字放置到盒子中,并且不要忘记在深搜时每一种可能性之间的关系都是平行的,因此每当我们用了一个数字并将其标记为已使用的时候,记得将其恢复为未使用的状态
```cpp
#include <iostream>
using namespace std;
const int N = 15;
int a[N],book[N];
int n;
void dfs(int step)
{
if(step == n + 1)
{
for(int i = 1; i <= n; i++) printf("%d ",a[i]);
printf("\n");
return;
}
for(int i = 1; i <= n; i++)
if(book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;//将其状态还原为未使用,以便于下次使用填充
}
}
int main()
{
cin >> n;
dfs(1);
return 0;
}