牛客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);
        }
    }
};
相关推荐
游是水里的游1 小时前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_1 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
南城花随雪。1 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
程序员老冯头4 小时前
第十五章 C++ 数组
开发语言·c++·算法
AC使者8 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp9 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
xiaoshiguang313 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode