一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 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!的想法不一定全部是自己想出来,也可以通过阅读优秀的人的代码学习。大概就是这样子啦~拜拜!}