牛客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);
        }
    }
};
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
码流子5 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven5 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark5 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218615 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法