看了好几篇文章,总结一下dfs如何套用的
例如:蓝桥杯第六届C语言中牌型种数来说:小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
先分析一下13个牌,每张牌有0,1,2,3,4种可能;总合要在13张
要想把所有的情况都罗列出来必须*必须分层考虑,所谓分层也就是把每一种牌都看成一层,一种牌存在的可能条件下去分析另外一种牌的所有可能;。
所以他的层次也就是牌的总类也就是点数。
他的判断边界是总牌数大于13,或者牌的点数大于14;
看一下代码
#include<stdio.h>
int sum=0,ans=0; //ans为最终的结果,sum为牌的总数
void fun(int n){
if(sum>13||n>14)return; //条件边界
if(n==14){ //最后一层下判断一下是否符合要求
if(sum==13)ans++; //如果符合要求ans++;
}else{
for(int i=0;i<5;i++) / /每一层中的可能为0,1,2,3,4
{
sum+=i; // 改变条件
fun(n+1); //递归到下一层
sum-=i;} //返回到初始层数时再回溯原来的条件
}
}
int main(){
fun(1);
printf("%d",ans);
return 0;
}