#include
#include
using namespace std;
int a[10], book[10], n;//全局变量若没有赋值默认为0
void dfs(int step) {//深度优先搜索
if (step == n + 1) {
for (int i = 1; i <= n; i++)
cout << a[i];
cout << endl;
return;//有的编译器可以不写也没问题,但有的编译器不支持
//所以还是必须写上吧确保万无一失
//这里的return可以理解成break,跳出一层函数
//比如说3的全排列,递归进入dfs(1),在dfs(1)里面又递归调用了dfs(2),
//在dfs(2)里面递归调用了dfs(3);然后在dfs(3)里调用dfs(4)
//在dfs(4)里输出结果,执行return语句
//这里应该是相当于break结束一层函数,也就是结束dfs(4),返回dfs(3)
//以此类推,直到结束
}
for (int 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);
return 0;
}
dfs是一个递归函数,main函数输入n的值后,dfs从1一直到n+1递归执行。
#include <iostream>
using namespace std;
int a[10]={0}, book[10]={0}, n;//全局变量若没有赋值默认为0,这里最好把a和book数组初始化一下,否则数组里的值是不确定的值
void dfs(int step) {
if (step == n + 1) //当step ==n+1的时候,输出a数组的值,并结束递归
{
for (int i = 1; i <= n; i++) //for循环遍历
cout << a[i]; //输出数组a的值
cout << endl; //这里输出一个换行符
return; //函数结束,返回上一层(这里返回后,回到main函数中)
}
for (int i = 1; i <= n; i++) //当step 小于n+1的时候,执行for循环,给数组a和数组book赋值
{
if (book[i] == 0) {
a[step] = i;//填数字,给数组元素a[i]赋值
book[i] = 1;//标记数字
dfs(step + 1);//递归调用
//这里可以理解成函数里有函数,一层一层展开
book[i] = 0;//回收数字
}
}
return;
}
int main() {
cin >> n; //输入n的值
dfs(1); //从1开始递归
return 0;
}