Problem Description
在一无限大的二维平面中,我们做如下假设:
1、 每次只能移动一格;
2、 不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、 走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
Input
首先给出一个正整数C,表示有C组测试数据
接下来的C行,每行包含一个整数n (n<=20),表示要走n步。
Output
请编程输出走n步的不同方案总数;
每组的输出占一行。
Sample Input
2 1 2
这里我们始终定义前为正方向.
我们用 a [ i ] 表示朝前走i步的种类,我们用 b [ i ] 表示朝左(右)走 i 步的种类,
显然 a [ 1 ] = 3,b [ 1 ] = 2;
然后分治的思想:
向前走 i 步(i>1)的种类相当于向前走 i-1 步的种类加上向左、向右走 i-1 步的种类.
数学式子表示就是: a [ i ] = a [ i-1 ]+2*b [ i-1 ];
向左(向右)走 i 步(i>1)的种类相当于向前走 i-1 步的种类加上向右(向左)走 i-1 步的种类.
数学式子表示就是: b [ i ] = a [ i-1 ]+b [ i-1 ];
然后递推可得.
代码如下:
#include <stdio.h> int main() { int a[21]={0,3},b[21]={0,2},i; for(i=2;i<21;i++) { b[i]=a[i-1]+b[i-1]; a[i]=a[i-1]+2*b[i-1]; } int m,N; scanf("%d",&N); while(N--) { scanf("%d",&m); printf("%d\n",a[m]); } return 0; }
时间: 2024-10-09 15:07:11