思路
一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。
一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
本题
#include<iostream>
using namespace std;
const int N = 10;
int n;
int path[N];
bool st[N];
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i ++) printf("%d ",path[i]);
cout << endl;
return;
}
for(int i = 1; i <= n; i ++)
{
if(!st[i]) //搜索没有用过的节点数
{
path[u] = i; //给树节点赋值
st[i] = true; //记录某个数已经使用过
dfs(u + 1); //开始搜索下一个位置
st[i] = false; //还原现场回溯
path[u] = 0; //回溯 可以省略这一步
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}