题目链接
先是照着MOOC上老师的代码抄了一遍,用的搜索做的
#include<iostream>
#include<cstring>
using namespace std;
int visited[30][50];
int ways(int i,int j,int n)
{
if(n == 0)
return 1;
visited[i][j] = 1;
int num = 0;
if(! visited[i][j+1]) num += ways(i,j+1,n-1);
if(! visited[i][j-1]) num += ways(i,j-1,n-1);
if(! visited[i+1][j]) num += ways(i+1,j,n-1);
visited[i][j] = 0;
return num;
}
int main()
{
int n;
cin >> n;
memset(visited,0,sizeof(visited));
cout << ways(0,25,n);
return 0;
}
提交后发现有用时0ms的,然后去搜了一下这道题目,发现这道题可以用数学方法的办法来解:
令F(n)表示走n步的方法总数,则可以得到递推式
F(n)=F(n−1)+2*
∑k=1n−2F(K)
再变下型可以得到
=F (n−1) + F (n−2) + F (n−2) +
∑k=1n−3F(K)
=2∗F(n−1)+F(n−2)
以及两个边界条件
F(0)=1,F(1)=3
#include<iostream>
using namespace std;
int main()
{
int n,ways[21];
ways[0] = 1;
ways[1] = 3;
cin >> n;
for(int i = 2;i <= n;++i)
ways[i] = 2*ways[i-1] + ways[i-2];
cout << ways[n];
return 0;
}