【C】北理C语言——曾困扰我很久的题目系列第2题

一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。

 

 

    请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。

输入:

    分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a<b 。)

输出:

    方案数量。


解题思路:

        看到这道题,首先应该想到的是用——递归。(与斐波那契数列对比一下能发现相同点的。)此处可以通过函数递归调用实现,也可以直接在主函数体内递归。

        这个最基础部分确定了,接着便是如何编码了。由于a和b都在1~100之间,而显然从第一格走到第100格的路径数目太大,远远超出int和long int可以控制的范围了。由此思考只能通过——数组,先逐位相加进位再逐位输出了。


代码实现:

#include<stdio.h>  
#include<string.h>  
int main()  
{  
    int m,n,o,i,j;  
    int add(int,int);  
    scanf("%d %d",&m,&n);  
    o=n-m;//printf("%d\n",o);  
    int a[110][100]={0};  
    a[1][0]=1;  
    a[2][0]=2;  
    for (m=3;m<=o;m++)  
    {  
        for (n=0;n<100;n++)  
        {  
            if (a[m][n]+a[m-1][n]+a[m-2][n]>=10)  
            {  
                a[m][n]=a[m][n]+a[m-1][n]+a[m-2][n]-10;  
                a[m][n+1]++;  
            }  
            else a[m][n]=a[m][n]+a[m-1][n]+a[m-2][n];  
        }  
    }  
    for(i=99;i>=0;i--)  
    {  
        if (a[o][i]!=0)  
        {  
            j=i;break;  
        }  
    }  
    for(i=j;i>=0;i--)  
    {  
        printf("%d",a[o][i]);  
    }printf("\n");  
}  
跳至...

{后记(一些最近的思考):编程,至少现阶段我个人做的编程题,不会出现太多太多行的情况,大多不会超过50行。由此可知:一、我们现阶段做的编程题不会太难,应该抱着好奇和探索的心态去解决这些问题,而不是一种消极的觉得题太难、编不出来的心态,这对于效率和速度都有及其大的负面影响。二、做题时尽量通过简练精妙的代码实现,而非冗长繁杂的代码。而前者较后者需要更多的思维含量,即编程前思考的部分。当然这种amazing!的想法不一定全部是自己想出来,也可以通过阅读优秀的人的代码学习。大概就是这样子啦~拜拜!}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值