找东西的WXS
题目描述
从前,有个叫wxs的人,他每次找东西的时候,只会到自己的右边去找东西,绝对不会返回去找,有一天,他的朋友把他的宝贝放在了一个和蜂房结构一样的地区中的某个房子里面,这个时候wxs就懵逼了,需要我们的帮助,假设wxs的位置是a,他的宝贝是b,那么让我们来编写一个程序,计算一下a走到b的所有路线吧。
其中,结构如下所示。
分析:
对于每一个数字,都只有两个方向可走。我们可以利用深度搜索来。将每条路都尝试一遍
#include"stdio.h"
int count=0,start,end;
dfs(int n)
{
if(n==end)//到了终点,count+1
{
count++;
return 0;
}
if(n>end)//有可能会超过终点,所以,需特判
return 0;
else
{
dfs(n+2);//此两个递归,分别表示两条路
dfs(n+1);
}
}
int main()
{
int x;
scanf("%d",&x);
while(x--)
{
scanf("%d%d",&start,&end);
count=0;
dfs(start);
printf("%d\n",count);
}
}
此方法可以,但因为数据过大,时间必然超限。因此,通过分析,我们会发现这就是一个数列。1 2 3 5 8 13……如果起点不是1,则通过变形将起点改成1;
代码如下:
#include"stdio.h"
int main()
{
long long s[51],a,b,i,j,n;
s[1]=1;s[2]=2;
for(i=3;i<51;i++)
s[i]=s[i-1]+s[i-2];
while(~scanf("%lld",&n))
{
while(n--)
{
scanf("%lld%lld",&a,&b);
b=b-(a)+1;
a=1;
printf("%lld\n",s[b-1]);
}
}
}