计算河内-Java的塔

时间:2017-03-11 15:48:06

标签: java sorting count towers-of-hanoi

我正在测试河内塔楼计划。我已经得到了测量程序时间的帮助,但这不是我教授想要的,他想要计算迭代次数。我无法理解它,我需要我的程序将运行的“总动作”,但它不会正确打印出来。你们能帮助我吗?谢谢你。

这是我使用的代码:

package stackoverflow;

import java.util.*;

public class towers {
    public static int N;
    public static Stack<Integer>[] integer = new Stack[4];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        integer[1] = new Stack<>();
        integer[2] = new Stack<>();
        integer[3] = new Stack<>();
        System.out.print("Enter 5 integers: ");
        int num = input.nextInt();
        N = num;
        StackMove(num);
    }

    public static void StackMove(int N) {
        for (int d = N; d > 0; d--)
            integer[1].push(d);
        PrintStack();
        move(N, 1, 2, 3);
    }

    public static void move(int N, int a, int b, int c) {
        if (N > 0) {
            move(N - 1, a, c, b);
            int d = integer[a].pop();
            integer[c].push(d);
            PrintStack();
            move(N - 1, b, a, c);
        }
    }

    public static void PrintStack() {
        System.out.println("  A  |  B  |  C");
        System.out.println("---------------");
        for (int i = N - 1; i >= 0; i--) {
            String d1 = " ", d2 = " ", d3 = " ";
            try {
                d1 = String.valueOf(integer[1].get(i));
            } catch (Exception e) {
            }
            try {
                d2 = String.valueOf(integer[2].get(i));
            } catch (Exception e) {
            }
            try {
                d3 = String.valueOf(integer[3].get(i));
            } catch (Exception e) {
            }
            System.out.println("  " + d1 + "  |  " + d2 + "  |  " + d3);
        }
        System.out.print("\n");
    }
}

输出应如下所示:

Outpu1 Output2

3 个答案:

答案 0 :(得分:1)

<强> CODE

import java.util.Stack;

import java.util.*;

public class TowersOfHanoiPrint {
    public static int N;
    public static Stack<Integer>[] integer = new Stack[4];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        integer[1] = new Stack<>();
        integer[2] = new Stack<>();
        integer[3] = new Stack<>();
        System.out.print("Enter 5 integers: ");
        int num = input.nextInt();
        N = num;
        System.out.println("Number of moves: "+StackMove(num));
    }

    public static int StackMove(int N) {
        for (int d = N; d > 0; d--)
            integer[1].push(d);
        PrintStack();
        return move(N, 1, 2, 3);
    }

    public static int move(int N, int a, int b, int c) {
        if (N > 0) {
            int numberMovesA = move(N - 1, a, c, b);
            int d = integer[a].pop();
            integer[c].push(d);
            PrintStack();
            int numberMovesB = move(N - 1, b, a, c);
            return (numberMovesA + numberMovesB + 1);
        }
        return 0;
    }

    public static void PrintStack() {
        System.out.println("  A  |  B  |  C");
        System.out.println("---------------");
        for (int i = N - 1; i >= 0; i--) {
            String d1 = " ", d2 = " ", d3 = " ";
            try {
                d1 = String.valueOf(integer[1].get(i));
            } catch (Exception e) {
            }
            try {
                d2 = String.valueOf(integer[2].get(i));
            } catch (Exception e) {
            }
            try {
                d3 = String.valueOf(integer[3].get(i));
            } catch (Exception e) {
            }
            System.out.println("  " + d1 + "  |  " + d2 + "  |  " + d3);
        }
        System.out.print("\n");
    }
}

<强>输出

Enter 5 integers: 6
  A  |  B  |  C
---------------
  1  |     |   
  2  |     |   
  3  |     |   
  4  |     |   
  5  |     |   
  6  |     |   

  A  |  B  |  C
---------------
     |     |   
  2  |     |   
  3  |     |   
  4  |     |   
  5  |     |   
  6  |  1  |   

  A  |  B  |  C
---------------
     |     |   
     |     |   
  3  |     |   
  4  |     |   
  5  |     |   
  6  |  1  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
  3  |     |   
  4  |     |   
  5  |     |  1
  6  |     |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  4  |     |   
  5  |     |  1
  6  |  3  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  4  |     |   
  5  |     |   
  6  |  3  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  4  |     |   
  5  |  2  |   
  6  |  3  |   

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  4  |  1  |   
  5  |  2  |   
  6  |  3  |   

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
  5  |  2  |   
  6  |  3  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  5  |  2  |  1
  6  |  3  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |     |   
  5  |     |  1
  6  |  3  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  5  |     |   
  6  |  3  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  5  |     |  3
  6  |     |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |     |   
  5  |     |  3
  6  |  1  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  2
  5  |     |  3
  6  |  1  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
  5  |     |  3
  6  |     |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
     |     |  3
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  2
  1  |     |  3
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  1  |  2  |  3
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
     |  2  |  3
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
  3  |  2  |   
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  3  |  2  |  1
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |     |   
  3  |     |  1
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  3  |     |   
  6  |  5  |  4

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  3  |  4  |   
  6  |  5  |   

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |  1  |   
  3  |  4  |   
  6  |  5  |   

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
  3  |  4  |   
  6  |  5  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  3  |  4  |  1
  6  |  5  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  3  |   
     |  4  |  1
  6  |  5  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  3  |   
  1  |  4  |   
  6  |  5  |  2

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |  2  |   
     |  3  |   
  1  |  4  |   
  6  |  5  |   

  A  |  B  |  C
---------------
     |     |   
     |  1  |   
     |  2  |   
     |  3  |   
     |  4  |   
  6  |  5  |   

  A  |  B  |  C
---------------
     |     |   
     |  1  |   
     |  2  |   
     |  3  |   
     |  4  |   
     |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |  2  |   
     |  3  |   
     |  4  |  1
     |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  3  |   
     |  4  |  1
  2  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  3  |   
  1  |  4  |   
  2  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  1  |  4  |  3
  2  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
     |  4  |  3
  2  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |  2
     |  4  |  3
     |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
     |  4  |  3
     |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
     |     |  3
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  2
  1  |     |  3
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  1  |  2  |  3
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
     |  2  |  3
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
  3  |  2  |   
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  3  |  2  |  1
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |     |   
  3  |     |  1
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  3  |     |   
  4  |  5  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
  1  |     |   
  2  |     |   
  3  |     |  5
  4  |     |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
  2  |     |   
  3  |     |  5
  4  |  1  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  2
  3  |     |  5
  4  |  1  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
  3  |     |  5
  4  |     |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  2
     |     |  5
  4  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  2
  1  |     |  5
  4  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |   
  1  |  2  |  5
  4  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |   
     |  2  |  5
  4  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |  1  |  4
     |  2  |  5
     |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  4
     |  2  |  5
     |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  1
     |     |  4
     |     |  5
  2  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |   
     |     |  4
  1  |     |  5
  2  |  3  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  3
     |     |  4
  1  |     |  5
  2  |     |  6

  A  |  B  |  C
---------------
     |     |   
     |     |   
     |     |  3
     |     |  4
     |     |  5
  2  |  1  |  6

  A  |  B  |  C
---------------
     |     |   
     |     |  2
     |     |  3
     |     |  4
     |     |  5
     |  1  |  6

  A  |  B  |  C
---------------
     |     |  1
     |     |  2
     |     |  3
     |     |  4
     |     |  5
     |     |  6

Number of moves: 63

答案 1 :(得分:1)

对于n项,将2提升到n并减去1

答案 2 :(得分:0)

关闭主题评论

以下是对您的代码的一些评论,但没有解决您的问题,但您必须被告知。 (关于以下主题评论)

标识符的命名

采用Java Naming Conventions

例如:

  • 类名以大写字母开头,而方法名以小写字母开头(反之亦然)
  • 变量也以小写字母开头,只有常量为ALL_UPPER_CASE

然后不要为变量使用单个字母名称。

为变量选择名称时,请从问题域中取出它们 变量integer的含义是什么? 这里更恰当的名称是stacks(注意复数&#39; s&#39;)但不是因为它拥有Stack类的对象,而是因为你正在为堆栈建模。 / p>

您的(类)成员变量N会干扰某些方法的参数N。这是唯一可以接受违反Java命名约定的点:您可以使用下划线(_)为成员变量添加前缀。这样可以有效避免这种干扰。

避免奇数球解决方案

这个加倍的标识符N导致程序中有两种不同的方法:

  • 您的某些方法访问成员变量N
  • 其他一些方法的参数类型和名称相同。

对于任何程序,请选择其中一种访问方法。

想象一下,如果您需要更改N会发生什么。你的程序会开始表现得很奇怪,你很难找到错误。

不要将Exceptions用作流控制

String d1 = " ", d2 = " ", d3 = " ";
try {
    d1 = String.valueOf(integer[1].get(i));
} catch (Exception e) {
}

使用此代码,如果第一个堆栈没有足够的元素,则将空间保留在d1中。您最好使用if语句来执行此操作:

String d1 = " ", d2 = " ", d3 = " ";
if( i < integer[1].size() ){
    d1 = String.valueOf(integer[1].get(i));
}

这不仅可以在您的代码中保存一行,而且还可以更好地传达您的原始代码。

使用基于零的索引。

您已声明大小为integer的数组4,以便能够通过自然计数访问其元素

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        integer[1] = new Stack<>();
        integer[2] = new Stack<>();
        integer[3] = new Stack<>();

这里的问题是你在该数组中有一个未使用的附加元素。更糟糕的是,它是该阵列中的第一个元素。

Java有一些聪明的例程处理数组(和集合),如果你的第一个数组元素应该像这样被忽略,那么这些例程会有问题或者至少需要特殊处理。

你可以通过使用另一种技术轻松解决这个问题:用常数替换幻数

您可以在类中定义常量:

public class towers {
    private static final int STACK_ONE = 0;
    private static final int STACK_TWO = 1;
    private static final int STACK_TREE = 2;

这会改变你的代码:

        integer[STACK_ONE] = new Stack<>();
        integer[STACK_TWO] = new Stack<>();
        integer[STACK_TREE] = new Stack<>();
 //...
                d1 = String.valueOf(integer[STACK_ONE].get(i));

有人可能会建议使用Java enum 类型,但与数组一起使用时这有点棘手。

关于主题评论

既然您选择我的答案作为解决方案,我觉得我必须为此做出贡献......; o)

在哪里添加实际计数

问题是:在代码中你在哪里进行可数移动?
显然这是move方法。 但并非所有对移动方法的调用都是可数的。如果您在里面输入if块,则只能计算移动数。因此,您需要添加&#34;计数代码&#34;。

如何实施计数?

这有四种方法。按复杂程度排列:

  1. 算术计算
  2. 其他成员变量,
  3. 额外参数和返回值
  4. 绕过柜台对象。
  5. 算术计算

    由于底层问题是确定性的,因此可以简单地计算移动的数量。该解决方案由Lew Bloch提供。

    其他成员变量

    您可以添加其他成员变量,例如N

     public class towers
     {
        public static int N;
        public static int moveCounter = 0;
    

    在上一节中确定的位置,您只需将1添加到此新成员变量的当前值。

    额外参数和返回值

    此解决方案由Dani提供

    绕过一个反击物体。

    这与以前的解决方案类似,但我们不需要返回某些内容。但我们还需要一个额外的课程才能做到这一点因此,对于这个简单的任务,这个解决方案很复杂,但我将它添加到记录中。

    public class towers {
      private static class Counter{
         private int counter = 0;
         void increment(){ counter++;}
         int counted() { return counter; }
      }
      // ...
            Counter numberOfMoves= new Counter(num,);
            StackMove(num,numberOfMoves);
            System.out.println("Number of moves: "+ numberOfMoves.counted());
      // ...
        public static void StackMove(int N, Counter numberOfMoves) {
            for (int d = N; d > 0; d--)
                integer[1].push(d);
            PrintStack();
            move(N, 1, 2, 3, numberOfMoves);
        }
        public static void move(int N, int a, int b, int c, Counter numberOfMoves) {
            if (N > 0) {
                move(N - 1, a, c, b, numberOfMoves);
                int d = integer[a].pop();
                integer[c].push(d);
                PrintStack();
                move(N - 1, b, a, c, numberOfMoves);
                numberOfMoves.count();
            }
         }
      // ...