我正在测试河内塔楼计划。我已经得到了测量程序时间的帮助,但这不是我教授想要的,他想要计算迭代次数。我无法理解它,我需要我的程序将运行的“总动作”,但它不会正确打印出来。你们能帮助我吗?谢谢你。
这是我使用的代码:
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");
}
}
输出应如下所示:
答案 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)
以下是对您的代码的一些评论,但没有解决您的问题,但您必须被告知。 (关于以下主题评论)
例如:
ALL_UPPER_CASE
然后不要为变量使用单个字母名称。
为变量选择名称时,请从问题域中取出它们
变量integer
的含义是什么?
这里更恰当的名称是stacks
(注意复数&#39; s&#39;)但不是因为它拥有Stack
类的对象,而是因为你正在为堆栈建模。 / p>
您的(类)成员变量N
会干扰某些方法的参数N
。这是唯一可以接受违反Java命名约定的点:您可以使用下划线(_
)为成员变量添加前缀。这样可以有效避免这种干扰。
这个加倍的标识符N
导致程序中有两种不同的方法:
N
。对于任何程序,请选择其中一种访问方法。
想象一下,如果您需要更改N
会发生什么。你的程序会开始表现得很奇怪,你很难找到错误。
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;。
这有四种方法。按复杂程度排列:
由于底层问题是确定性的,因此可以简单地计算移动的数量。该解决方案由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();
}
}
// ...