搜索
您的当前位置:首页正文

智力题_环回到原点问题

来源:爱够旅游网

一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:

经过n步回到0点有多少种不同的走法?

举例:

如果n=1,则出发只能到1或者9,不可能回到0,共0种走法。如果n=2,则从0出发有4条路径:0->1->0,0->1->2,0->9->8,0->9->0,其中有两条回到了0点,故有两种走法。

思路:

考虑用动态规划的思想,只可能从左边或者右边相邻点回到原点,即先到旁边的点,看看有多少回来的方法。

所以动态转移方程为dp[k][n]=dp[k-1][(n-1+10)%10]+dp[k-1][(n+1)%10] //其中,第一维为具体步数,第二维为位置。取模保证范围在0-n-1,初始n=0,从0号位置开始。

递归写法:

#include <iostream>
#include <cstdio>
using namespace std;
int DFS(int n,int pos)
{
    if(n==0&&pos)
        return 0;
    if(n==0)return 1;
    return DFS(n-1,(pos-1+10)%10)+DFS(n-1,(pos+1)%10);
}
int main()
{
    int n;
    cin>>n;
    int dp[10][n];
    cout<<DFS(n,0)<<endl;
return 0;
}

 

迭代写法:

#include <iostream>
#include <cstdio>
using namespace std;
#define N 10
int main()
{
    int n;
    cin>>n;
    int dp[n+1][N]={0};
    dp[0][0]=1;
    for(int i=1;i<=n;i++)  //步数
    {
        for(int j=0;j<N;j++)
        {
            dp[i][j]=dp[i-1][(j-1+N)%N]+dp[i-1][(j+1)%N];
        }
    }
    cout<<dp[n][0]<<endl;
return 0;
}

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top