本文是程序员算法趣题一书Q04 C语言实现,由于该书中所给的代码是Javascripts与Ruby,故在今后的阅读中会记录部分习题的C语言实现。
Q04问题后面的Column中介绍了深度优先搜索和广度优先搜索。
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。

代码实现两种方式:

/*
    Name: Q04切分木棒
    Copyright: 52coder.net
    Author: 52coder
    Date: 04/09/17 23:44
    Description: Q04
*/
#include <stdio.h>
#include <stdlib.h>
/*递归实现,终止条件是木棒数大于n*/
int cutbar(int n,int m,int current)
{
    if(current >= n)
        return 0;
    else if(current < m)/*人多,可以当前current,下次翻倍*/
        return 1 + cutbar(n,m,current * 2);
    else/*人比木棒数目少,下次多m个木棒*/
        return 1 + cutbar(n,m,current + m);
}
/*逆向思维方法m个人黏1cm的木棒组成n cm的木棒*/
int cut(n,m)
{
    int count = 0;
    int current = 1;
    while(current <= n)
    {
        if(current < m)
            current += current;
        else
            current += m;
        
        count += 1;
    }
    
    return count;
    
}

int main()
{
    int n = cut(20,3);
    int m = cut(100,5);
    printf("%d %d\n",n,m);
    return(0);
}