C++学习记录算法篇:深度优先搜索1-n的全排列
深度优先搜索的核心思想是**“不撞南墙不回头”,即对每一个路径进行深入直到不能深入为止**,之后再退回上一步,继续尝试新的路径,直到把每一条路径都尝试一遍。
核心代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void dfs(int step) { 判断边界 for(int i=1;i<=n;i++) { dfs(step+1); } return; }
|
案例:求n的全排列:
这里通过将手上标有1~n的牌放到n个箱子里,来模拟全排列的过程,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<iostream> using namespace std;
int n;
int box[10], book[10];
void dfs(int step) { if (step == n + 1) { for (int i = 1; i <= n; i++) { cout << box[i] << " "; } cout << endl; return; }
for (int i = 1; i <= n; i++) { if (book[i] == 0) { box[step] = i;
book[i] = 1;
dfs(step + 1);
book[i] = 0; } } return; }
int main() { cin >> n;
dfs(1);
return 0; }
|
核心代码分析:
