智力题_环回到原点问题
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 移动时图片总是回到原点