要求不允许直接从一段移动到另一端,必须通过中间
class Method {
public static void main(String[] args) {
handelHanoiTower3(6);
}
public static void handelHanoiTower1(int n) {
Stack<Integer> sour = new Stack();
Stack<Integer> leftStack = new Stack();
Stack<Integer> midStack = new Stack();
Stack<Integer> rightStack = new Stack();
for (int i=n; i>0; i--) {
sour.push(i);
}
int steps = 0;
// 数组内元素值表示对应元素最后一步的移动方向是左还是右 0-左 1-右
int[] directions = new int[3];
while (!sour.isEmpty()) {
// last, 最新一步执行的数据在哪个栈上 0-左 1-中 2-右
int last = 0;
directions[0] = -1;
leftStack.push(sour.pop());
while (!leftStack.isEmpty() || !midStack.isEmpty()) {
if (last == 0) {
if (directions[last] == -1) {
if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
}
} else {
if (!midStack.isEmpty() && !rightStack.isEmpty()) {
if (midStack.peek() < rightStack.peek()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
} else {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
}
} else {
if (midStack.isEmpty()) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
} else if(rightStack.isEmpty()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
}
}
}
} else if (last == 1) {
Integer mid = midStack.peek();
if (directions[last] == 0) {
if (leftStack.isEmpty() || leftStack.peek() > mid) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
} else if(leftStack.peek() < mid) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
}
} else {
if (rightStack.isEmpty() || rightStack.peek() > mid) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
} else if(rightStack.peek() < mid) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
}
}
} else {
if (!leftStack.isEmpty() && !midStack.isEmpty()) {
if (leftStack.peek() < midStack.peek()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
} else {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
}
} else {
if (leftStack.isEmpty()) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
} else if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
}
}
}
}
}
System.out.println("tower with " + n + " storey, and total steps: " + steps);
}
public static void handelHanoiTower2(int n) {
Stack<Integer> leftStack = new Stack();
Stack<Integer> midStack = new Stack();
Stack<Integer> rightStack = new Stack();
for (int i=n; i>0; i--) {
leftStack.push(i);
}
int right = 0;
int steps = 0;
// 数组内元素值表示对应元素最后一步的移动方向是左还是右 0-左 1-右, 下标: 0-左 1-中 2-右
int[] directions = new int[3];
// last, 最新一步执行的数据在哪个栈上 0-左 1-中 2-右
int last = 0;
while (!leftStack.isEmpty() || !midStack.isEmpty()) {
if (last == 0) {
if (leftStack.size() == n) {
directions[0] = -1;
right++;
n--;
}
if (directions[0] == -1) {
if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
} else {
if (!midStack.isEmpty() && !rightStack.isEmpty()) {
if (midStack.peek() < rightStack.peek()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
} else {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
}
} else {
if (midStack.isEmpty()) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
} else if(rightStack.isEmpty()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
}
}
}
} else if (last == 1) {
Integer mid = midStack.peek();
if (directions[last] == 0) {
if (leftStack.isEmpty() || leftStack.peek() > mid) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
} else if(leftStack.peek() < mid) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
} else {
if (rightStack.isEmpty() || rightStack.peek() > mid) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
} else if(rightStack.peek() < mid) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
}
}
} else {
if (!leftStack.isEmpty() && !midStack.isEmpty()) {
if (leftStack.peek() < midStack.peek()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
} else {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
}
} else {
if (leftStack.isEmpty()) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
} else if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
}
}
}
System.out.println("total steps: " + steps);
}
public static void handelHanoiTower3(int n) {
Stack<Integer> leftStack = new Stack();
Stack<Integer> midStack = new Stack();
Stack<Integer> rightStack = new Stack();
for (int i=n; i>0; i--) {
leftStack.push(i);
}
int right = 0;
int steps = 0;
// 数组内元素值表示对应元素最后一步的移动方向是左还是右 0-左 1-右, 下标: 0-左 1-中 2-右
int[] directions = new int[3];
// last, 最新一步执行的数据在哪个栈上 0-左 1-中 2-右
int last = 0;
while (!leftStack.isEmpty() || !midStack.isEmpty()) {
if (last == 0) {
if (leftStack.size() == n) {
directions[0] = -1;
right++;
n--;
}
if (directions[0] == -1) {
if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
} else {
if (!midStack.isEmpty() && !rightStack.isEmpty()) {
if (midStack.peek() < rightStack.peek()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
} else {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
}
} else {
if (midStack.isEmpty()) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
} else if(rightStack.isEmpty()) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
}
}
}
} else if (last == 1) {
Integer mid = midStack.peek();
if (directions[last] == 0) {
if (leftStack.isEmpty() || leftStack.peek() > mid) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
} else if(leftStack.peek() < mid) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
} else {
if (rightStack.isEmpty() || rightStack.peek() > mid) {
Integer ele = midStack.pop();
rightStack.push(ele);
last = 2;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from mid to right");
if (right == rightStack.size()) {
last = 0;
}
} else if(rightStack.peek() < mid) {
Integer ele = rightStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from right to mid");
}
}
} else {
if (!leftStack.isEmpty() && !midStack.isEmpty()) {
if (leftStack.peek() < midStack.peek()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
} else {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
}
} else {
if (leftStack.isEmpty()) {
Integer ele = midStack.pop();
leftStack.push(ele);
last = 0;
directions[last] = 0;
steps++;
System.out.println("Move " + ele + " from mid to left");
} else if (midStack.isEmpty()) {
Integer ele = leftStack.pop();
midStack.push(ele);
last = 1;
directions[last] = 1;
steps++;
System.out.println("Move " + ele + " from left to mid");
}
}
}
}
System.out.println("total steps: " + steps);
}
}