題目:一隻小蜜蜂
遞歸做法:
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<string>
using namespace std;
int cnt=0;//count
int a,b;
//int flag=0;
int tran[3]={1,2};//座標移動
void done(int x)
{
int begin=0,bet=0;
begin=x;
if(begin>b)return ;//越界
if(begin==b)
{
//cout<<"1"<<endl;
cnt++;
return ;
}//到達終點
else
{
for(int i=0;i<2;i++)
{
bet=begin+tran[i];//移動位置
done(bet);
//cout<<"2"<<endl;
}
}
return ;
}
int main()
{
int n;
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
done(a);
printf("%d\n",cnt);
cnt=0;
flag=0;
}
return 0;
}
一題遞歸類型的題目,比較簡單。我犯了兩個粗心的錯誤,一個是終點判斷使用了a,還有一個是main函數裏面的輸入格式寫錯了...也感謝興桔的講解。
貼上興桔ppt的一部分,和函數遞歸的模板和深度優先搜索有關係。
這題是規律題,用平常的遞歸會T,規律能看出符合斐波那契數列,所以這裏給出它的做法。
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
long long int f[55];
f[1]=1;
f[2]=2;
for(int i=3;i<55;i++)
{
f[i]=f[i-1]+f[i-2];
}
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
printf("%lld\n",f[m-n]);
}
}
參考博客:杭電2044一隻小蜜蜂
博主的公告也很有意思:“屌絲分爲兩種,一種是沒有夢想,渾噩一生的屌絲,另一種是懷揣着夢想,奮鬥一生的屌絲。”
題目:母牛的故事
代碼:
#include<cstdio>
#include<iostream>
#include<stdlib.h>
using namespace std;
int done(int x)
{
int c;
if(x<=3) c=x;
else c=done(x-1)+done(x-3);
return c;
}
int main()
{
int n;
int tot=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
tot=done(n);
printf("%d\n",tot);
tot=0;
}
return 0;
}
解釋一下遞歸的語句:
int done(int x)
{
int c;
if(x<=3) c=x;
else c=done(x-1)+done(x-3);
return c;
}
從第n年開始往回找到第一年,前3年牛的數目是按+1的規律來遞增的,當年數大於3的時候,母牛的數目等於去年的母牛數目+今年生產的母牛數,今年生產的母牛數由題意(小牛過三年能生育)等於三年前的總牛數,過了三年以後當時的牛都能生。