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

题目


题目链接:

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代码

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代码

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 复制代码
<?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++代码

cpp 复制代码
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);
        }
    }
};
相关推荐
旺小仔.18 分钟前
双指针和codetop复习
数据结构·c++·算法
jingfeng51437 分钟前
C++ STL-string类底层实现
前端·c++·算法
雲墨款哥2 小时前
JS算法练习-Day10-判断单调数列
前端·javascript·算法
FPGA2 小时前
CRC校验原理及其FPGA实现
算法
Jina AI2 小时前
回归C++: 在GGUF上构建高效的向量模型
人工智能·算法·机器学习·数据挖掘·回归
Coovally AI模型快速验证2 小时前
YOLO、DarkNet和深度学习如何让自动驾驶看得清?
深度学习·算法·yolo·cnn·自动驾驶·transformer·无人机
luoqice2 小时前
linux下找到指定目录下最新日期log文件
linux·算法
楽码2 小时前
底层技术SwissTable的实现对比
数据结构·后端·算法
fffcccc11122 小时前
初级背包问题,层层剖析为什么这样做。最好需要自己推演一遍。
算法
瓦特what?3 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘