DFS
DFS的重点在于递归,是一种利用递归(实际上是用栈来保存未访问的结点,先进后出)实现的搜索算法,直到找到解或走不下去为止。“不撞南墙不回头”
int check(参数) { if(满足条件) return 1; return 0; } void dfs(int step) { 判断边界(找到解||走不下去了) { 相应操作 } 尝试每一种可能 { 满足check条件 标记 继续下一步dfs(step+1) 恢复初始状态(回溯时用到) } }
1.边界条件的判断
2. 当下该如何做
3.下一步如何做与现在这一步如何做是一样的
DFS常用于找所有解的问题,找到的不一定是最优解
思路:
先写参数,肯定得有一或多个参数来表示现在所在得位置,其次你得有走到这儿的代价,比如步数,花费什么的。
然后开始写出口,直接上if干,只要现在所在位置是你要的目标位置就返回结果(一般是代价)。
之后就是下一步怎么走,只要调用下一层DFS就可以了(注意参数的变化),如果下一层DFS有返回值且是一个有效值 就返回这个值。
最后就是应对无解,只需在函数返回一个值代表无解就可以了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 51167078
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int ans=0; //走法统计 6 7 void dfs(int num,int step) //步数 台阶剩余数 8 { 9 if(step<0) //走不下去 10 return; 11 if(step==0&&num%2==0) 12 { 13 ans++; 14 return; 15 } 16 dfs(num+1,step-1); 17 dfs(num+1,step-2); 18 } 19 20 int main() 21 { 22 dfs(0,39); 23 printf("%d\n",ans); 24 return 0; 25 }
李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 14
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int ans=0; //方案统计 6 char s[15]; 7 8 void dfs(int a,int b,int jiu,int sum) //店 花 酒 当前走了多少步 9 { 10 if(!jiu&&!a&&!b&&s[14]=='b') //出口 !jiu、!a、!b 酒 店 花全部用完等于0 并且最后遇到的是花 11 { 12 ans++; 13 return; 14 } 15 if(a>0) //假设下一步遇到的是店 下一步的其中一种走法 16 { 17 s[sum]='a'; //标记 18 dfs(a-1,b,jiu*2,sum+1); //调用下一层 19 } 20 if(b>0&&jiu>0) //假设下一步遇到的是花 并且还有酒可以喝 21 { 22 s[sum]='b'; //标记 23 dfs(a,b-1,jiu-1,sum+1); //调用下一层 24 } 25 } 26 27 int main() 28 { 29 int jiu=2; 30 dfs(5,10,jiu,0); 31 printf("%d\n",ans); 32 return 0; 33 }