题目大意:
在一无限大的二维平面中,我们做如下假设:
1、 每次只能移动一格;
2、 不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、 走过的格子立即塌陷无法再走第二次;



解题思路:1)题目的定义是在一个无限大的二维平面中,我们不妨暂时不考虑坐标的问题,画一下图就知道设不设坐标没影响。
              2)已知每一步可以向上向左向右走,因此我们可以明确:
                           当当前步选择向上走的时候,其前一步可以是由左边,下边,上边走过来的;
                           当当前步选择向左走的时候,其前一步可以是由右边,下边走过来的;
                           当当前步选择向右走的时候,其前一步可以是由左边,下边走过来的。
              3)所以,不妨设:a[n].le,a[n].ri,a[n].up,a[i].all分别表示当前步数选择的方法数,则有:
                         a[i].le=a[i-1].up+a[i-1].le;
                         a[i].ri=a[i-1].up+a[i-1].ri;
                         a[i].up=a[i-1].le+a[i-1].ri+a[i-1].up;
                         a[i].all=a[i].le+a[i].ri+a[i].up;


代码:
 1#include <iostream>
 2#include <cstdio>
 3#include <cstring>
 4#include <cmath>
 5
 6using namespace std;
 7
 8
 9struct numm
10{  int le;
11   int ri;
12   int up;
13   int all;
14}
a[50];
15int T,n;
16
17
18int main()
19{   a[1].le=1;
20    a[1].ri=1;
21    a[1].up=1;
22    a[1].all=3;
23    for (int i=2; i<=20; i++)
24    {
25        a[i].le=a[i-1].up+a[i-1].le;
26        a[i].ri=a[i-1].up+a[i-1].ri;
27        a[i].up=a[i-1].le+a[i-1].ri+a[i-1].up;
28        a[i].all=a[i].le+a[i].ri+a[i].up;
29    }

30    cin >> T;
31    while (T--)
32    {
33        cin >> n;
34        cout << a[n].all << endl;
35
36    }

37    return 0;
38}

39