专题三1016

来源:互联网 发布:ztree导出json 编辑:程序博客网 时间:2024/06/07 02:40

题目大意:

假定有一张无限大的二维平面图,然后选一个点作为起点,然后每次只能移动一个格,只能向左、向右和向前而不能向后走,程序输入一个正整数n表示要走的步数,编程输出走n步共有几种走法,注意:每种走法中每个格只能走一次。

解题思路:

刚开始其实并没有什么思路,然后自己画了一张二维的平面图来测试前几个实例,我算了算n=3的时候是17步,然后n=4的时候是41步,接下来我就开始寻找其中的规律。当n=1时,ans=3=1+1+1n=2的时候ans=2+2+3n=3的时候ans=5+5+7n=4的时候ans=12+12+17,我把每一次的答案都分成三部分,是因为这三部分分别代表了向左、右、前走的方法数,向左和向右的步数是相等的,然后向前走的走法等于n-1时候的总的走法,我就在试探找出其中的规律,我发现ans[n]=ans[n-1]*2+ans[n-2],之后我就定义了一个长度为21的数组ans[21],然后定义ans[1]ans[2],根据上述公式计算出ans[3]ans[20]的值存到数组里面,根据输入的步数,将其作为下标,输出数组的值即为答案。

感想:

这题关键在于找到这其中的规律,即上面的那个公式,找到那个公式,一切就都迎刃而解了。

代码如下:

#include<iostream>

using namespace std;

int main()

{

int ans[21];

int c;

cin >> c;

ans[1] = 3;

ans[2] = 7;

for (int i = 3; i < 21; i++)

ans[i] = ans[i - 1] * 2 + ans[i - 2];

while (c--)

{

int n;

cin >> n;

cout << ans[n] << endl;

}

system("pause");

return 0;

}

0 0