哈理工oj 1612 方格问题
Description
在一无限大的二维平面中,我们做如下假设:1、 每次只能移动一格;
2、 你可以向左走,可以向右走,也可以向上走,但是不可以向下走。
3、 走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
Input
首先给出一个正整数T(T <= 20),表示有T组测试数据
接下来的T行,每行包含一个整数n (n<=20),表示要走n步。
Output
请编程输出走n步的不同方案总数;
每组的输出占一行。
Sample Input
2
1
2
Sample Output
3
7
-----------------------------------------------------------------------------------------------------
结果如下:
0 0
1 3
2 7
3 17
4 41
点分为两种:一种是向上走的,下一步有3种走法:向上,向左,向右;
另一种是向一侧走的,下一步可以有2种走法:向上,向左或者向右;
用a[]代表第一种,b[]代表第二种
|
---|---
#include<stdio.h>
int main()
{
int i,n,t;
int a[21]= {0,1}; ///a[1]第一步 向上走 1
int b[21]= {0,2}; ///b[1]第一步 向左或者向右走 2
for(i=2; i<=20; i++)
{ ///a[] 0 1 3 b[] 0 2 4
a[i]=a[i-1]+b[i-1]; ///第二步a[2]=1+2=3 因为第一步走完第二步都可以向上走
b[i]=a[i-1]*2+b[i-1];///第二步b[2]=1*2+2 因为第一步向上走完可以向左或右走*2 加上 第一步向左或右走的方案数
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",a[n]+b[n]);
}
return 0;
}
-----------------------------------------------------------------------------------------------------
递归公式为:a[n] = 2*a[n-1] + a[n-2]
#include <iostream>
using namespace std;
int main()
{
int a[21];
a[0] = 0;
a[1] = 3;
a[2] = 7;
for(int i = 3;i < 21; i++)
a[i] = 2*a[i-1]+a[i-2];
int T,n;
cin>>T;
while(T--)
{
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}