dfs深度搜索全排列图解详细步骤(图解版)

在初学dfs深度搜索的时候,会经常看到如下场景:

  int main()
 {
      cin >> N;    
      dfs(1);
      return 0;
 }

看到这个的时候,我整个人就迷惑了:只有一个dfs(1)? 为什么是dfs(1),而不是dfs(N)??dfs究竟是什么在递归?

 

为了解决这些疑惑,我按着全排列的代码画了个图。现在也算是明白了。

这幅图是帮助初学dfs深度搜索的朋友,更好的明白dfs执行的过程。

我把dfs在执行的时候,进行了什么操作,执行了哪一步都详细的做了图解,方便更好的理解dfs

 

本图以3 的全排列为例:

123 ,132 ,213 ,231, 312, 321

 

 

 

 X-mind源文件有需要评论区d一声

下面是全排列的代码,是可以直接编译滴。

 

/*
Project: full permutation(全排列)
Date:    2020/09/22
Author:  Frank Yu
*/
#include<iostream>
#include<iomanip>
#define Max 10
using namespace std;
 
int N; //层数
int vis[Max];
int nums[Max];
void print()
{
    for (int i = 1; i <= N; ++i)
    {
        cout << setw(5)<< nums[i];
    }
    cout << endl;
}
void dfs(int n)
{
    if (n > N) print();
    else
    {
        //选择数字
        for (int i = 1; i <= N; ++i)
        {
            if (!vis[i])
            {
                nums[n] = i;
                vis[i] = 1;
                dfs(n + 1);
                // 回溯 忘记曾达到n+1层,操作撤销 nums会覆盖,不必撤销
                vis[i] = 0;
            }
        }
    }
}
 
int main()
{
    cin >> N;
    // 从第1层开始搜索
    dfs(1);
    return 0;
}

 

友友们下次见!

 

posted @ 2022-01-25 19:34  白色飞碟  阅读(899)  评论(0)    收藏  举报