关于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; }
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 }
说明:在排列数字位数少时两种方法时间消耗感觉不出来,但一当数字位数增加A方法十分耗时的弊端就体现出来了,而B方法相比时间就要少很多但由于用到递归所以空间占用相对于A来说要多,所以如果位数很多要注意可能会有溢出的风险。
2.......(咕咕咕)
以上是关于关于DFS一点微小想法的主要内容,如果未能解决你的问题,请参考以下文章
伪一周小结(没错我一周就做了这么点微小的工作)HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版