解题思路:
这道题目要求不能回走,而且每个格子只能走一次,那么我就假定他是往上走的(只能上、左、右),那么前n步里,不能够出现←和→,否则就违反了每个格子只能走一次的规定。
1)假设第n步是↑,那么就很好办,不管怎么走都不会违反规定,共有f(n-1)种;
2)假设第n步是←(以←为例,实际和→的情况一样,到时候乘以2即可),那么第n-1步要么是↑,要么还是←;如果第n-1步是↑,那么就共有2*f(n-1)种。假设是←,那么第n-2步既可能是↑又有可能还是←,.......,直到全部都为←为止,那么推导下来可以得到总的次数为2*(f(n-1)+f(n-2)+f(n-3)+......+f(1)+2),最后的2是有这种情况,第一步是↑,其余全是←,或者全部都是←。
综上,f(n) = f(n-1) + 2*(f(1)+f(2)+......+f(1)+2)
哎,第一次推的时候自己用笔算f(3)漏了一种情况,结果一直怀疑自己的推理过程,最后拿别人的代码测试一下数据,结果还真是我自己笔算的时候漏了一种情况。。。。浪费了好多时间。。
AC:
#include<iostream>
using namespace std;
__int64 f[25];
int main()
{
f[1] = 3; f[2] = 7;
for(int i = 3; i <= 20; i++)
{
f[i] = f[i-1] + 4;
for(int j = i-2; j >= 1; j--)
f[i] += 2*f[j];
}
int t,n;
cin>>t;
while(t--)
{
cin>>n;
cout<<f[n]<<endl;
}
return 0;
}