智力题_环回到原点问题

Posted dtwd886

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智力题_环回到原点问题相关的知识,希望对你有一定的参考价值。

一个环上有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;

 

以上是关于智力题_环回到原点问题的主要内容,如果未能解决你的问题,请参考以下文章

圆环回原点问题-字节跳动高频题

使用 UIPanGestureRecognizer 移动时图片总是回到原点

一切又回到了原点

判断10步能不能回到原点

回到前台的 iPhone 应用程序将视图移回其原点,并且键盘仍然可见

回到原点 重新感受01背包的魅力 ZerOnePack