九连环(递归)

九连环
Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

不知道大家有没有玩过一个叫做 九连环 的玩具,如下图所示。

如果你不了解九连环,那玄黄就带你领略九连环的奥妙:
九连环是我国传统的民间智力玩具,玩具上面有九个连环套在杆上,目标就是通过一定的方式将九个连环从杆上全部取下来。
玩法是这样的:
1、对每个环,有2种操作:把这个环放到杆上或把这个环从杆上取下
2、你可以随意的对第1个环进行操作
3、如果你想对第i个环(i>1)进行操作,你必须将第i-1个环放在杆上,且必须把i-2个环从杆上取下

Input

输入一个整数n ( 0

Output

输出把所有连环取下来的最少操作步骤,每一步占一行,输出一个整数i和操作”UP”或者”DOWN”,代表将第i个环放到杆上或从杆上取下来,整数和操作用空格分开。详情见示例输出。

Sample Input

4
Sample Output

2 DOWN
1 DOWN
4 DOWN
1 UP
2 UP
1 DOWN
3 DOWN
1 UP
2 DOWN
1 DOWN

在这里插入图片描述

#include <stdio.h>
#include <string.h>
void up(int n);
void down(int n)
{
    if(n==1)
        printf("1 DOWN\n");
    else if(n<=0) return ;
    else
    {
        down(n-2);
        printf("%d DOWN\n",n);
        up(n-2);
        down(n-1);
    }
}

void up(int n)
{
    if(n==1)
        printf("1 UP\n");
    else if(n<=0) return ;
    else
    {
        up(n-1);
        down(n-2);
        printf("%d UP\n",n);
        up(n-2);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    down(n);
    return 0;
}

类似的递归hanoi汉诺塔
在这里插入图片描述
这里的move(n,a,b,c)是表示从a移到c的动作b只是个传参

void move(int m,char a,char b,char c)
{
    if(m==1)
        printf("Move disk %d from %c to %c\n",m,a,c);
    else
    {
        move(m-1,a,c,b);
        printf("Move disk %d from %c to %c\n",m,a,c);
        move(m-1,b,a,c);
    }
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
buuctf(BUU CTF)是北京邮电大学举办的一项网络安全竞赛活动。九连环是其中的一道题目。 九连环是一个由九个环组成的智力游戏,目标是通过一系列的操作,将环从上到下按照一定的规则进行排列。这道题目可能要求我们编写一个程序来解决九连环的排列问题。 我们可以采用深度优先搜索(DFS)算法来解决该问题,该算法可以遍历所有可能的排列情况,并找到符合要求的解。具体步骤如下: 1. 定义一个长度为9的数组,用来表示九连环的初始排列。 2. 编写一个归函数,该函数的目标是通过一系列的操作将九连环按照规则进行排列,同时记录每一个操作的过程。 3. 在归函数中,使用循环遍历可能的操作情况,并以此对九连环进行操作。 4. 当九连环排列符合规则时,返回当前的排列和操作过程。 5. 当九连环没有符合规则的操作时,返回失败。 在解决该问题时,我们需要考虑以下几点: - 确定九连环的初始状态和目标状态。 - 设计合适的数据结构来存储操作过程和状态信息。 - 对归函数进行合理的剪枝,以减少不必要的归调用。 通过以上的思路和步骤,我们可以编写一个程序来解决九连环的排列问题。在BUU CTF中,我们可以使用该程序来解答九连环的题目,并提交给评测系统进行评判。最终得到正确的排列和操作过程,即可获得相应的分数和排名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值