Advertisement
CeaselessSoul

Tower of Hanoi Solver

Mar 26th, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.72 KB | None | 0 0
  1. // Imports
  2. import java.util.Map;
  3. import java.util.Stack;
  4. import java.util.HashMap;
  5.  
  6. // Class
  7. public class Solver {
  8.     private int NumberOfDisks = 0;
  9.  
  10.     private Map<String, Stack<Integer>> Rods = new HashMap<>() {
  11.         {
  12.             put("A", new Stack<>());
  13.             put("B", new Stack<>());
  14.             put("C", new Stack<>());
  15.         }
  16.     };
  17.  
  18.     public Solver(int disks) {
  19.         if (disks < 3) {
  20.             throw new IllegalArgumentException("You need to have at least three disks.");
  21.         } else {
  22.             NumberOfDisks = disks;
  23.             setup();
  24.         }
  25.     }
  26.  
  27.     public void solve() {
  28.         reset();
  29.  
  30.         if (NumberOfDisks % 2 == 0) {
  31.             solveTowerOfHanoi(0, "A", "C", "B");
  32.         } else {
  33.             solveTowerOfHanoi(0, "A", "B", "C");
  34.         }
  35.  
  36.         System.out.println(Rods.get("A") + " " + Rods.get("B") + " " + Rods.get("C"));
  37.     }
  38.  
  39.     private void solveTowerOfHanoi(int state, String from, String intermediary, String to) {
  40.         if (!Rods.get("A").empty() || !Rods.get("B").empty()) {
  41.             moveDisk(from, to);
  42.  
  43.             if (state == 0) {
  44.                 solveTowerOfHanoi(1, from, to, intermediary);
  45.             } else {
  46.                 solveTowerOfHanoi(0, intermediary, from, to);
  47.             }
  48.         }
  49.     }
  50.  
  51.     private void moveDisk(String rodKey1, String rodKey2) {
  52.         Stack<Integer> rod1 = Rods.get(rodKey1);
  53.         Stack<Integer> rod2 = Rods.get(rodKey2);
  54.  
  55.         Integer ring1 = !rod1.empty() ? rod1.peek() : NumberOfDisks;
  56.         Integer ring2 = !rod2.empty() ? rod2.peek() : NumberOfDisks;
  57.  
  58.         if (ring1 < ring2) {
  59.             rod2.push(rod1.pop());
  60.         } else {
  61.             rod1.push(rod2.pop());
  62.         }
  63.     }
  64.  
  65.     private void setup() {
  66.         for (int index = NumberOfDisks - 1; index >= 0; index--) {
  67.             Rods.get("A").push(index);
  68.         }
  69.     }
  70.  
  71.     private void reset() {
  72.         for (Stack<Integer> rod : Rods.values()) {
  73.             while (!rod.empty()) {
  74.                 rod.pop();
  75.             }
  76.         }
  77.  
  78.         setup();
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement