PTA L2-1 【用递归实现】九连环问题

宝贝早点睡1004 软件23 2023-12-09 19:07:25

L2-1【用递归实现】 九连环问题

分数 10

作者 李祥

单位 湖北经济学院

题目

九连环是一种流传于山西省的传统民间的智力玩具,由九个圆环相连成串,以解开为胜。

题图1.jpg

九连环的九个环,一环扣一环地套在钗上。除了第 1 号环可以随时装上或卸下以外,其它环装上或卸下的条件是:在它的前面仅有紧靠它那一个环在钗上。即:当第 1 ~ i−2 号环都不在钗上,第 i−1 号环在钗上,这时可以装上或卸下第 i 号环。

输入格式

环数 操作(U表示装上, D表示卸下)

输出格式

装上或卸下九连环的操作步骤
每行显示一步操作,具体格式为:
环号: U或D (U表示装上,D表示卸下)

输入样例1

3 U

输出样例1

1: U
2: U
1: D
3: U
1: U

输入样例2

4 D

输出样例2

2: D
1: D
4: D
1: U
2: U
1: D
3: D
1: U
2: D
1: D

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路

1、装环:当装上第n环时,首先需装上第n-1环,装上第n-1环之前,需装上第n-2环,依次往前推,则应先装上第1环,再装上第2环;再卸下第1环剩余第2环,可以装上第3环,卸下第2环剩余第3环,可以装上第4环,依次往后推,卸下第n-2环后,可以装上第n环;再按照之前的步骤,依次将环全部装上。

2、卸环:当卸下第n环时,首先需卸下第n-2环,要卸下第n-2环,需卸下第n-4环,依次往前推,则应先卸下第1环,再卸下第3环,装上第一环,卸下第2环,卸下第一环,再卸下第五环装上第一环,装上第二环,卸下第一环,装上第三环,装上第一环,卸下第二环,卸下第一环,卸下第四环……后面每卸下一环,都需按照此步骤装上再卸下,直到卸下第n环,再依次将后面的环全部卸下。

3、无论结果如何,最后一步一定是第一环的装上与卸下,即最终结果一定返回到1。

代码如下:

#include <stdio.h>   
void D(int n);          
void U(int n);  
int main() {
    int n;
    char a;
    scanf("%d %c",&n,&a);  
    if(a=='U'){
    U(n);                  
    }else if(a=='D'){     //进行哪种操作,则对应那一函数部分
    D(n);
    }
    return 0;
}

void D(int n) {    //定义卸下过程的函数
    if(n==1){
        printf("1: D\n");     

//无论一个环还是多个环,最后一步均是对第1环的操作,直接输出

    }else if(n<=0){
        return;     //n<=0时,则输出n的值及对应操作
    }else{

//首先排除1和小于等于0的情况

        D(n-2);    //卸下第n-2个才能卸下第n个
        printf("%d: D\n",n); 

//n的值不断在函数D(n)中操作再返回,若大于1,则继续递归,直到环能够被卸下为止

        U(n-2); 
        D(n-1); //装上第n-2个,可以卸下第n-1个,重复该过程,直到全部卸下
    }
}
 
void U(int n) {
    if(n==1){
        printf("1: U\n");
    }else if(n<=0){
        return;
    }else{
        U(n-1); 
        D(n-2);  //装上第n-1个,卸下第n-2个才能装上第n个,n不断递归,直到为1或小于等于0 
        printf("%d: U\n",n);
        U(n-2);  //重复装环的过程,直到装上最后一个
    }
}

 代码运行结果:

问题总结:

弄清楚装环与卸环时函数的递归关系。

 

 

 

 

 

 

 

...全文
291 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
html,css,按钮 精选按钮样式设计美学与交互体验全解析 在数字产品的交互设计中,按钮作为连接用户与功能的关键桥梁,其样式设计直接影响用户体验与界面质感。本页面基于buttons.css样式库,精心呈现了一系列兼具美学价值与实用功能的按钮设计方案,为开发者与设计师提供直观的视觉参考与代码借鉴。 按钮设计看似简单,实则融合了视觉心理学、交互逻辑与品牌调性的多重考量。从极简的单色按钮到富有层次感的立体按钮,从静态的基础样式到带有hover动效的交互反馈,每一款设计都兼顾了视觉吸引力与操作清晰度。例如页面中展示的药丸反色按钮,通过圆润的边角处理(button-pill类)与高对比度的色彩反转(button-inverse类),既强化了视觉焦点,又在移动端场景中提升了触控识别度,尤其适合作为主要操作按钮使用。 页面采用简洁明快的布局逻辑,浅色背景与高对比度按钮形成鲜明视觉层次,每个按钮示例均搭配详细说明,清晰标注样式类名与适用场景。这种设计不仅便于开发者快速定位所需样式,更能帮助设计初学者理解"样式类组合"的设计思路——通过基础类与修饰类的灵活搭配,可衍生出海量符合不同场景需求的按钮样式,大幅提升开发效率。 无论是电商平台的购买按钮、社交应用的交互按钮,还是工具类产品的功能按钮,本页面展示的设计方案均遵循"一致性与差异性平衡"的原则:基础样式保持统一的视觉语言,确保界面整体性;特殊场景按钮通过色彩、形状或动效的微调,实现功能区分与重点突出。此外,所有按钮样式均基于标准化CSS类实现,便于开发者直接复用或根据品牌调性进行二次定制,兼顾了设计美感与开发实用性。 对于追求高效开发的团队而言,这样的样式库不仅能减少重复劳动,更能保障产品界面的设计一致性;对于设计师而言,这些经过实践验证的按钮样式可作为创意起点,在此基础上探索更具个性的设计表达。浏览本页面时,建议结合实际产品场

286

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧