n个数的全排列:
#include <iostream>
using namespace std;
int a[10], book[10];//数组a表示格子,数组book[]表示卡片是否用过,全局变量在没有赋值之前都是0
int n;
void dfs(int step) {//step表示现在开始摆放第几个盒子
int i;
if (step == n + 1) {//如果摆放n+1时,说明前面n个盒子都已经摆放好了
for (i = 1; i <= n; i++) {
cout << a[i];
}
cout << endl;
return;//返回之前的一步(最近一次调用dfs函数的地方)
}
//此时在第step个盒子面前,把每张牌来一一尝试
for (i = 1; i <= n; i++) {
if (book[i] == 0) {
//开始尝试扑克牌i
a[step] = i;//将i号牌放入第step个盒子里
book[i] = 1;//表示此时牌i已经不再手上
//第step个盒子已经放好了,此时尝试第step+1个盒子
dfs(step + 1);//递归调用自己
book[i] = 0;//一封要将之前尝试的牌收回,才可以进行下一次尝试
}
}
};
int main()
{
cin >> n;
dfs(1);//首先从第一个盒子开始
return 0;
}
深度优先搜索的基本类型:
void dfs(int step){
判断边界
尝试每一种可能
for(i=1;i<=n;i++){
继续下一步dfs(step+1);
}
返回
}