Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Imports
- import java.util.Map;
- import java.util.Stack;
- import java.util.HashMap;
- // Class
- public class Solver {
- private int NumberOfDisks = 0;
- private Map<String, Stack<Integer>> Rods = new HashMap<>() {
- {
- put("A", new Stack<>());
- put("B", new Stack<>());
- put("C", new Stack<>());
- }
- };
- public Solver(int disks) {
- if (disks < 3) {
- throw new IllegalArgumentException("You need to have at least three disks.");
- } else {
- NumberOfDisks = disks;
- setup();
- }
- }
- public void solve() {
- reset();
- if (NumberOfDisks % 2 == 0) {
- solveTowerOfHanoi(0, "A", "C", "B");
- } else {
- solveTowerOfHanoi(0, "A", "B", "C");
- }
- System.out.println(Rods.get("A") + " " + Rods.get("B") + " " + Rods.get("C"));
- }
- private void solveTowerOfHanoi(int state, String from, String intermediary, String to) {
- if (!Rods.get("A").empty() || !Rods.get("B").empty()) {
- moveDisk(from, to);
- if (state == 0) {
- solveTowerOfHanoi(1, from, to, intermediary);
- } else {
- solveTowerOfHanoi(0, intermediary, from, to);
- }
- }
- }
- private void moveDisk(String rodKey1, String rodKey2) {
- Stack<Integer> rod1 = Rods.get(rodKey1);
- Stack<Integer> rod2 = Rods.get(rodKey2);
- Integer ring1 = !rod1.empty() ? rod1.peek() : NumberOfDisks;
- Integer ring2 = !rod2.empty() ? rod2.peek() : NumberOfDisks;
- if (ring1 < ring2) {
- rod2.push(rod1.pop());
- } else {
- rod1.push(rod2.pop());
- }
- }
- private void setup() {
- for (int index = NumberOfDisks - 1; index >= 0; index--) {
- Rods.get("A").push(index);
- }
- }
- private void reset() {
- for (Stack<Integer> rod : Rods.values()) {
- while (!rod.empty()) {
- rod.pop();
- }
- }
- setup();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement