您的位置:首页 > 其它

李白打酒-DFS

2016-03-13 18:52 405 查看
第三题:李白打酒 (8' )

    话说大诗人李白,一生好饮。幸好他从不开车。

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。

    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

    注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

快速解题思路:dfs 

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;

#define eps 10e-10

int ans;

void dfs(int alco,int store,int flower,int pre)//dfs的参数为根节点,因同时有store和flower的限定,将其放入参数中较方便
{
if(store==0&&flower==0)
{
if(pre==0&&alco==0)//标记最后一次遇到的是花
{
ans++;
}
return;//已经没有店家和花,此时不管是否情况正确,都退出递归
}
if(store > 0)
{
dfs(alco*2,store-1,flower,1); //标记遇到的是店家
}

if(alco > 0 && flower > 0)
{
dfs(alco-1,store,flower-1,0);
}
return ;
}
int main()
{
ans = 0;
dfs(2,5,10,-1);
cout<<ans<<endl;
return 0;
}


答案:14 

深度优先

        这个图,深度优先就像铁骨铮铮的好汉,遵循“能进则进,不进则退”的原则。

        第一步:同样也是从isTrav数组中选出一个未被访问的节点,如V1。

        第二步:然后一直访问V1的邻接点,一直到走头无路的时候“回溯”,路线为V1,V2,V3,V4,V5,到V5的时候访问邻接点V1,发现V1是访问过的,

                   此时一直回溯的访问直到V1。

        第三步: 同样有的图中通过一个顶点的“深度优先”不能遍历所有的顶点,此时我们重复(1-2)的步骤就可以最终完成深度优先遍历。

              




顶1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: