关于DFS一点微小想法

Posted stardust-sh-hyk313

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于DFS一点微小想法相关的知识,希望对你有一定的参考价值。

1.数字排列

 这种问题有两种解决思想:

  A.一个一个去尝试(枚举)

  B.通过一个开始点去寻找(DFS)

    相同点:都会先定住一个树。比如:对”1、2、3“这三个数进行全排列,人们总会先定住一个数(这里我定住”1“),这样下来变化范围就变小了而且这个变化可以控制了("23“,”32“)。

        总结一下就是:当第一个数字位为”1“时有两种排列方式(”123“,”132“)。

    不同点:A思想是通过将所有数进行尝试判断出合适的记录下来,B思想是通过起始数去寻找将找到符合要求的排列方式记录下来。

具体实施代码:

技术分享图片
#include <stdio.h>
#include <stdlib.h>

int main()
{
    for(int i = 1; i <= 3; i++)
    {
        for(int j = 1; j <= 3; j++)
        {
            for(int k = 1; k <= 3; k++)
            {
                if(i != j && i != k && j != k)
                {
                    printf("%1d%1d%1d
",i,j,k);
                }
            }
        }
    }
    return 0;
}
A方法代码
技术分享图片
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int n,book[20] = {0},a[20] = {0};
 4 void dfs(int step)
 5 {
 6     if(step == n+1)
 7     {
 8         for(int i = 1; i <= n; i++)
 9         {
10             printf("%d",a[i]);
11         }
12         printf("
");
13         return;
14     }
15 
16     for(int i = 1; i <= n; i++)
17     {
18         if(book[i] == 0)
19         {
20             a[step] = i;
21             book[i] = 1;
22 
23             dfs(step+1,a,book);
24             book[i] = 0;
25         }
26     }
27     return;
28 }
29 int main()
30 {
31     n = 3;
32     dfs(1,a,book);
33     return 0;
34 }
B方法代码

 说明:在排列数字位数少时两种方法时间消耗感觉不出来,但一当数字位数增加A方法十分耗时的弊端就体现出来了,而B方法相比时间就要少很多但由于用到递归所以空间占用相对于A来说要多,所以如果位数很多要注意可能会有溢出的风险。

2.......(咕咕咕)

以上是关于关于DFS一点微小想法的主要内容,如果未能解决你的问题,请参考以下文章

伪一周小结(没错我一周就做了这么点微小的工作)HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版

关于读《构建之法》的一点微小的感想

关于UED前端开发的一点想法

如何准确延长微小视频片段的持续时间?

关于树形结构的一点东西

关于WEB项目的一点想法