全排列深搜的三种实现和广搜实现
深搜1 普通递归实现
递归一个全局变量数组 a[n]
, 用 bool
数组 b[n]
表示数字是否被使用
由于节点只用全局变量数组 a[n]
来表示, 所以每次回溯都要恢复为未递归时节点的状态
#include <iostream>
using namespace std;
const int N = 10;
int n, a[N];
bool b[N];
void DFS(int k)
{
if(k == n) // 递归的终止节点
{
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return;
}
for(int i = 1; i <= n; i++) // 用 1 到 n 来填第 k 个位置
{
if(!b[i]) // 如果数字 i 未被使用
{
b[i] = true; // 设置数字 i 被使用
a[k] = i; // 用数字 i 来填第 k 个位置
DFS(k+1); // 向下层节点遍历
b[i] = false; // 设置数字 i 未被使用, 为遍历兄弟节点做准备
}
}
}
int main()