簡體   English   中英

河內塔解決方案問題

[英]Towers of Hanoi solution issue

我正在調試有關河內塔問題的一些解決方案,並且總是發現一個令人困惑的規則。 我認為存在一個限制條件,即“磁盤從一個桿的頂部滑到另一個桿上”。

我的問題是,如果第45行起作用,這意味着“緩沖”桿在當前桿旁邊,那么“目標”桿不應在當前桿旁邊。 這意味着線46是不正確的,因為我們將桿移動到不與當前桿相鄰的位置。

但這似乎是唯一的解決方案? 如果有人能澄清這種混亂,那就太好了。

這是我正在調試的代碼:

 public static void main(String[] args) {
    int n = 5;
    Tower[] towers = new Tower[n];
    for (int i = 0; i < 3; i++) towers[i] = new Tower(i);
    for (int i = n - 1; i >= 0; i--) towers[0].add(i);
    towers[0].moveDisks(n, towers[2], towers[1]);
}

public class Tower {
    private Stack < Integer > disks;
    private int index;
    public Tower(int i) {
        disks = new Stack < Integer > ();
        index = i;
    }

    public int index() {
        return index;
    }

    public void add(int d) {
        if (!disks.isEmpty() && disks.peek() <= d) {
            System.out.println(“Error placing disk” + d);
        } else {
            disks.push(d);
        }
    }

    public void moveTopTo(Tower t) {
        int top = disks.pop();
        t.add(top);
        System.out.println(“Move disk” + top + “from” + index() + “to” + t.index());
    }

    public void print() {
        System.out.println(“Contents of Tower“ + index());
        for (int i = disks.size() - 1; i >= 0; i--) {
            System.out.println(““ + disks.get(i));
        }
    }

    public void moveDisks(int n, Tower destination, Tower buffer) {
        if (n > 0) {
            moveDisks(n - 1, buffer, destination);
            moveTopTo(destination);
            buffer.moveDisks(n - 1, destination, this);
        }
    }
}

預先感謝林

沒有這樣的規則,即A盤從一根桿的頂部滑到物理上的另一根桿上 您可以將磁盤從一根桿移動到另一根桿,只要

  • 您一次移動一個磁盤
  • 不能在小磁盤的頂部放置任何磁盤
  • 然后,您可以將當前桿的上盤移至目標桿的頂部。

因此,它不需要塔架在物理上彼此相鄰。

河內塔的問題是使用遞歸的一個簡單的三步問題,共有三根桿:

start , buffer and the destination

步驟1:將n-1個磁盤從起點移動到緩沖棒。

步驟2:將第n個磁盤從起始位置移動到目標位置。

步驟3:將n-1個磁盤從緩沖區移動到目標位置。

就是說,這可以很容易地用Java編寫。

class Toh
{
 public static void main(String []args)
 {
  int n=5;
  toh(n,1,2,3);//move n disks from rod 1 to 3 using 2
 }
 public static void toh(int n,int start,int buffer,int destination)
 {
  if(n<1)
   return;
  toh(n-1,start,destination,buffer);//step 1
  System.out.println("disk moved from rod "+start+" to "+destination);//step 2
  toh(n-1,buffer,start,destination);//step 3
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM