九连环-递归解法

//求取下n环和放上n环的步数

int ans;
//规则一:第一环可以在任何时候放上或取下环柄。
//规则二:只有紧跟在领头环后的环可以放上或取下环柄。(领头环是套在柄上的最前面的环
int DownRing(int);
int UpRing(int);
int DownRing(int n)
{
    int res = 0;
    if(n == 1)
        return 1;
    if(n>2)
        res = (res + DownRing(n-2))%SMod;   //移下n-2个,第n-1个变为领头环
    res += 1;     //移下第n个
    if(n>2)
        res = (res + UpRing(n-2))%SMod;   //将n-2个移上去,以便移下第n-1个
    if(n>1)
        res = (res + DownRing(n-1))%SMod;  //此时就变成了将n-1个移下去了
    return res;
}

int UpRing(int n)
{
    int res = 0;
    if(n == 1)
        return 1;
    if(n>1)
        res = (res + UpRing(n-1))%SMod;  //移上n-1个
    if(n>2)
        res = (res + DownRing(n-2))%SMod;   //将n-2个移下,此时第n-1个变成领头环
    res += 1;       //移上第n个
    if(n>2)
        res = (res + UpRing(n-2))%SMod;   //将n-2个环移上去
    return res;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
        printf("%d\n",DownRing(n));
    return 0;
}

九连环-递归解法,布布扣,bubuko.com

时间: 2024-09-29 03:01:13

九连环-递归解法的相关文章

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

高效率的取幂运算,递归解法跟非递归解法

long int Pow( long int x, unsigned int n ) { // 求幂运算 if( n == 0 ) return 1; if( n == 1 ) return x; if( n % 2 == 0 ) return Pow( x * x, n / 2 ); else return Pow( x, n - 1 ) * x; // 可以用下列的注释行替换 //return Pow( x * x, n / 2 ) * x; } 上面的是递归解法,时间复杂度为 O(logN

骑士周游问题 --- 递归解法 --- java代码

骑士游历: 定义了向量的数组M,行数组X,列数组Y, 棋盘plane,计数器count,走动步数step 需要注意的是,递归函数的进入前的验证,原先的想法是传入来时的方向参数,可是这样的想法被实践否定了, 从理论上看,一个棋子走向哪里是不受它的过去制约的,最近的过去也不例外, 详情请见:http://en.wikipedia.org/wiki/Knights_tour 代码如下: /** * Created by kodoyang on 2014/5/3. */ public class Kni

汉诺塔问题的递归解法

汉诺塔问题的递归解法: 实现程序: #include<iostream> using namespace std; void move(int n, char i, char j) { cout << "把" << n << "号从" << i << "移动到" << j << endl; } void hanoi(int n, char x, cha

二叉树的先序、中序、后序、层次遍历的递归和非递归解法

二叉树的先序.中序.后序.层次遍历的递归和非递归解法 package tree; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class TreeTraverse { /** * 先序递归 * @param root */ public static void preOrderTraverse(TreeNode root) { if (root == null) { ret

[LeetCode系列]N皇后问题递归解法 -- 位操作方式

N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. 下面贴出代码和图解, 也就不赘述了. 1 class Solution { 2 public: 3 /* 使用位操作实现的回溯算法. 按行扫描, 检测可以放置的列. 4 * 'limit' - 都是 '1'. 代表着所有列都被占据了 5 * 'h' - 是目前所有皇后列在行上的垂直投影. 如果 h=

每天刷个算法题20160524:阿克曼函数的递归转非递归解法

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524754 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西