把搜索的过程想象成一棵树,一共有n个位置需要填写,我们的顺序是从第一个位置开始向后填写,在过程中需要注意记录哪些数字还没有填写,还有,记得恢复状态
//枚举第u个位置
void dfs(int u)
{
if(已经遍历完)
{
输出结果;
return;
}
for()
{
遍历每个可能转移到的状态;
做出改变;
dfs(下一层);
恢复状态;
}
}
//全排列问题
#include<iostream>
using namespace std;
const int N = 10;
int n;
int path[N];
bool st[N];//true表示这个点已经被使用过了
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i++)
cout << path[i] <<" ";
cout << endl;
return;
}
for(int i = 1; i <= n; i++)
{
if(!st[i])
{
path[u] = i;//填写第u个位置
st[i] = true;
dfs(u+1);//进入下一层
//恢复状态
path[u] = 0;
st[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}