方格问题 | ||||||
| ||||||
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 | ||||||
Hint | ||||||
Author | ||||||
陈禹@HRBUST |
思路
一开始思考使用bfs后面华华丽丽的TLE了,然后发现这是一个简单的思维问题。
对于第n-1种情况,那么在第n次时
向左走的路径 = 第n-1次最后一步时向上走的路径数量 + 第n-1次最后一步时向左走的路径数量;
向右走的路径 = 第n-1次最后一步时向上走的路径数量 + 第n-1次最后一步时向右走的路径数量;
向上走的路径 = 第n-1次最后一步时向上走的路径数量 + 第n-1次最后一步时向右走的路径数量 + 第n-1次最后一步时向左走的路径数量;
然后把这三者全部加起来就说第n次的路径。
#include<iostream>
using namespace std;
int main(void)
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a = 1;
int b = 1 ;
int c = 1;
for(int i = 1 ; i < n ; i++){
int ta = a+c;
int tb = b+c;
int tc = a+b+c;
a = ta;
b = tb;
c = tc;
}
cout<<a+b+c<<endl;
}
return 0;
}