关于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\n",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("\n");
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.......(咕咕咕)

猜你喜欢

转载自www.cnblogs.com/stardust-sh-hyk313/p/10059117.html