#include<iostream>
using namespace std;
//这个题是从1到n的数,有多少种排列方法。可以理解为把1到n这n个数放到a[1]到a[n]中去。
//重点有2个:1、每把一个数放到数组a【】中,就立马标记这个数。用book【i】,i即这个数本身。
// 2、递归:每放好一个数之后要继续放下一个数,即调用函数本身。核心是什么时候返回。(放完所有数返回)
int n,a[101],book[101];//book[]为标记数组,a[]为记载数组,n是总数
void dfs(int step)
{
int i;
if (step> n) {
for (int j = 1; j <= n;j++) {
cout << a[j] << " ";
}
cout << endl ;
return;
}
for (i= 1; i <=n; i++) //尝试每一种可能
{
if (book[i] == 0) //没有用过的数据才可以使用
{
a[step] = i;
book[i] = 1;
dfs(step + 1);//核心:递归——继续下一步
book[i] = 0;//重点:下一步执行完了,该我本身尝试下一种可能,所以前面本层次标记的(本格子)数据要清除。
}
}
return;//本层次所有的数据都遍历完成,所以要返回。
}
int main() {
cin >> n;
dfs(1);
system("pause");
return 0;
}
/*
//上面是一个例子,下面是DFS算法的一般形态;
//搞懂两个return,你就明白了DFS
void M_dfs(int a) {
if (条件a)//撞到南墙,走到边界,满足条件
{
...//执行条件体。
return;//有了一条完整的到头的路了
}
for (i = 1; i < n; i++)//尝试每一种可能
{
//函数体1
//...
//
M_dfs(a + 1);//下一步
}
return; //本层次走完,回退一步
}*/
推荐《啊哈算法》对初学者挺和善的。