题目要求:
输入一个数n,输出1~n的全排列。比如,输入3,输出123、132、213、231、312、321。
解题思路:
用深度优先搜索,假设有n个盒子,从第一个盒子开始依次放直到放到最后一个盒子,期间用到递归调用。放到最后一个后,再依次返回,进行重新组合,其中还用到标记数组来判断是否被用过。
代码实现:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[10], book[10], n;
void dfs(int step) {//step表示现在站在第几个盒子面前
int i;
if (step == n + 1) {//如果站在第n+1个盒子面前,表示前n个盒子已经放好了扑克牌
for (i = 1; i <= n; i++)
printf("%d", a[i]);
printf("\n");
return;//返回之前的一步,即最近一次调用dfs的地方
}
//此时站在第step个盒子面前应该放那张牌呢?按照1、2、3...n的顺序一一尝试
for (i = 1; i <= n; i++) {
//判断扑克牌i是否还在手上
if (book[i] == 0) {//表示第i号扑克牌在手上
//开始尝试使用扑克牌
a[step] = i;
book[i] = 1;//表示i号扑克牌已不在手上
//第step个盒子已经放好,接下来要走下一