牛客NC67 汉诺塔问题【中等 递归 Java/Go/PHP/C++】 lintcode 169 · 汉诺塔

news2024/9/17 3:58:16

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/7d6cab7d435048c4b05251bf44e9f185
https://www.lintcode.com/problem/169/

思路

 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,
 有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,
操作过程中盘子可以置于A、B、C任一杆上。

   分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,
    但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,
    可以做以下三步:
         (1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
         (2)将A杆中剩下的第n号盘移至C杆;
         (3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

Java代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串ArrayList
     */
    public ArrayList<String> getSolution (int n) {
        //https://blog.csdn.net/2301_76249062/article/details/136219560
        /*
        相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,
        有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
        游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
        操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,
        操作过程中盘子可以置于A、B、C任一杆上。

        分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,
        但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,
        可以做以下三步:
            (1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

            (2)将A杆中剩下的第n号盘移至C杆;

            (3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

         */
        ArrayList<String> ans = new ArrayList<>();
        hnt(n, "left", "mid", "right", ans);

        return ans;
    }

    public void move(String from, String to, ArrayList<String> ans) {
        ans.add("move from " + from + " to " + to);
    }

    public void hnt(int n, String a, String b, String c, ArrayList<String> ans) {
        if (n == 1) {
            move(a, c, ans);
        } else {
            hnt(n - 1, a, c, b, ans);
            move(a, c, ans);
            hnt(n - 1, b, a, c, ans);
        }
    }
}

Go代码

package main

import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param n int整型
 * @return string字符串一维数组
 */
func getSolution(n int) []string {
	//https://blog.csdn.net/2301_76249062/article/details/136219560
	/*
	   相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,
	   有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
	   游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
	   操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,
	   操作过程中盘子可以置于A、B、C任一杆上。

	   分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,
	   但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,
	   可以做以下三步:
	       (1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

	       (2)将A杆中剩下的第n号盘移至C杆;

	       (3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

	*/

	ans := []string{}
	hnt(n, "left", "mid", "right", &ans)
	return ans
}

func move(from, to string, ans *[]string) {
	*ans = append(*ans, fmt.Sprintf("move from %s to %s", from, to))
}
func hnt(n int, a, b, c string, ans *[]string) {
	if n == 1 {
		move(a, c, ans)
	} else {
		hnt(n-1, a, c, b, ans)
		move(a, c, ans)
		hnt(n-1, b, a, c, ans)
	}
}

PHP代码

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return string字符串一维数组
 */
function getSolution( $n )
{

//https://blog.csdn.net/2301_76249062/article/details/136219560
    /*
    相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,
    有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
    游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
    操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,
    操作过程中盘子可以置于A、B、C任一杆上。

    分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,
    但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,
    可以做以下三步:
        (1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

        (2)将A杆中剩下的第n号盘移至C杆;

        (3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

     */

    $ans = array();
    hnt($n,"left","mid","right",$ans);
    return $ans;
}

function move($from,$to,&$ans){
    $ans[count($ans)] = "move from ".$from." to ".$to;
}
function hnt($n,$a,$b,$c,&$ans){
    if($n==1){
        move($a,$c,$ans);
    }else{
        hnt($n-1,$a,$c,$b,$ans);
        move($a,$c,$ans);
        hnt($n-1,$b,$a,$c,$ans);
    }
}

C++代码

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串vector
     */
    vector<string> getSolution(int n) {


//https://blog.csdn.net/2301_76249062/article/details/136219560
        /*
        相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,
        有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
        游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
        操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,
        操作过程中盘子可以置于A、B、C任一杆上。

        分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,
        但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,
        可以做以下三步:
            (1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

            (2)将A杆中剩下的第n号盘移至C杆;

            (3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

         */

        vector<string> ans;
        hnt(n, "left", "mid", "right", ans);
        return ans;
    }

    void move(string from, string to, vector<string>& ans) {
        ans.push_back("move from " + from + " to " + to);
    }
    void hnt(int n, string a, string b, string c, vector<string>& ans) {
        if (n == 1) {
            move(a, c, ans);
        } else {
            hnt(n - 1, a, c, b, ans);
            move(a, c, ans);
            hnt(n - 1, b, a, c, ans);
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书生·浦语大模型全链路开源体系-作业1

视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 1. LLM发展 LLM是近年来人工智能领域的一个重要发展方向。大型语言模型的历史可以追溯到2017年,当时OpenAI推出了GPT-1(Generative Pre-trained Transformer)模型,这是一个基于Transformer架构的语言生成…

论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023

《论文阅读》学习了解自己&#xff1a;一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享&#xff0c;细节画图解释…

28【Aseprite 作图】苹果——拆解

1 画苹果框架 左边:第一行 7 第二行 2 第三 四行1 竖着7行 竖着2行 竖着1 、1 行 横着2个 横着4个 苹果可以是左右对称的,完成上述后,水平翻转到右边 2 枝叶 第一行1 左边 2 3 4 行,各1 第5行,竖着4个 再横着3个 右边 竖着3个,然后斜着2个,然后斜着1个 最上面的,两个…

RTDETR结合CVPR2024最新图像增强算法!让你的模型无惧风雨【含端到端推理脚本】

如何有效地探索雨痕的多尺度表示对于图像去雨是很重要的。与现有的基于Transformer的方法相比,这些方法主要依赖于单一尺度的雨痕外观,我们开发了一个端到端的多尺度Transformer,利用各种尺度中潜在有用的特征来促进高质量的图像重建。为了更好地探索空间变化的雨痕的常见退…

九宫格转圈圈抽奖活动,有加速,减速效果

在线访问demo和代码在底部 代码&#xff0c;复制就可以跑 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

2023idea没有VCS首次提交代码到Git

1、setting 2、vcs------>create git repository 3、右键项目----->Git------>add 4、右键项目------>git------>commit Directory 之后就会显示这个页面(下面写你提交的信息&#xff0c;就是你修改了什么) 点击commit,提交 5、Git--------->push 6、选择…

C++基础:类的继承,public,private,protected

三种继承模式 在上图中: 派生继承 三种继承模式 protected模式中 父类的公有属性和保护属性的成员在子类中都会变为保护属性,只能通过父类或者子类的成员函数调用. 代码示例: #include <iostream> #include <string> using namespace std; //protected class per…

numpy-mkl的下载地址

不要使用pip3直接在终端安装&#xff0c;因为pip3默安装的是numpy&#xff0c;而不是numpymkl。 采用在第三方库中手动下载后&#xff0c;再安装的方式。 第三方库网址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 如果不能进入就可以选择去git里面&#x…

代码随想录算法训练营第四十一天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 代码随想录 视频&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;| 理论基础 |力扣刷题总结| 动态规划入门_哔哩哔哩_bilibili 动归五部曲 1.dp数组以及下标的含义 2.递推公式 3.dp数组如何初始化 4.遍历顺序(例如先背包再…

Python 求积分

文章目录 Part.I IntroductionPart.II 基础知识Chap.I 特殊量的表示Chap.II integrate 函数简析 Part.III 实例Chap.I 一重积分Chap.II 二重积分 Reference Part.I Introduction 高中及大学时代&#xff0c;苦『积分』久矣&#xff0c;当时如掌握了此『黑科技』&#xff0c;课…

【MiniCPM-V】win10本地部署OCR等性能测试

性能尝试 本地配置如下 --------------------------------------------------------------------------------------- | NVIDIA-SMI 546.80 Driver Version: 546.80 CUDA Version: 12.3 | |-----------------------------------------------------…

设计模式17——模板方法模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 模板方法模式&#xff08;Temp…

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制&#xff0c;尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁&#xff08;如内置锁或显式锁&#xff09;时&#xff0c;如果锁已被其他线程持有&#xff0c;通常的做法是将该线程置于阻塞状态&#xff0c;…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中&#xff0c;并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

02 FreeRTOS 任务

1、创建任务函数 1.1 动态内存的使用 在之前我们如果要创建一个与学生有关的任务&#xff0c;我们会定义&#xff1a; //打印50个学生的信息 char name[50][100]; int age[50]; int sex[50]; //1表示男&#xff0c;0表示女 int score[50]; 如果之后要对其进行修改会非常麻烦&…

java面对对象编程-多态

介绍 方法的多态 多态是在继承&#xff0c;重载&#xff0c;重写的基础上实现的 我们可以看看这个代码 package b;public class main_ {public static void main(String[] args) { // graduate granew graduate(); // gra.cry();//这个时候&#xff0c;子类的cry方法就重写…

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

第36届世界超级小姐大赛安徽赛区正式启动

5月26日,在现场几百位出席仪式的社会名流、时尚界大咖、文化旅游机构负责人和前沿品牌代表以及现场嘉宾的共同见证下&#xff0c;第36届世界超级小姐大赛安徽赛区活动的神秘面纱终于在安徽黄山悠悠湖文化中心正式揭开。伴随着高亢激情的现代音乐&#xff0c;长发飘逸、身形灵动…

“AURORA-M:首个遵循人类审查安全指令微调的开源多语言模型

在人工智能领域&#xff0c;多模态学习是一个日益增长的研究领域&#xff0c;它涉及将来自不同源&#xff08;如图像、文本、音频等&#xff09;的信息结合起来。但高昂的训练计算成本限制了模型的普及性&#xff0c;使得小型机构和个人难以负担。而且现有模型在多语言能力上受…

结算协同,打通企业上下游业、财、票、资

市场变革&#xff0c;转型当先 随着电子发票的普及与数字化浪潮的涌动&#xff0c;企业正面临着前所未有的转型挑战。如何在快速变化的市场中站稳脚跟&#xff0c;提升竞争力&#xff1f;答案在于数字化转型&#xff0c;特别是供应链结算流程的革新。 无纸化、自动化&#xff0…