00vk

Hanoi Towers 3411

Aug 6th, 2021 (edited)
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.84 KB | None | 0 0
  1. package pack1;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Collection;
  5. import java.util.Deque;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8.  
  9. /**
  10.  * Created by vkondratiev on 06.08.2021
  11.  */
  12. public class HanoiTowers {
  13.  
  14.     private static final List<String> STRINGS = Arrays.asList(
  15.             "ALPHA", "BRAVO", "CHARLIE", "DELTA", "ECHO", "FOXTROT", "GOLF", "HOTEL", "INDIA", "JULIET", "KILO", "LIMA",
  16.             "MIKE", "NOVEMBER", "OSCAR", "PAPA", "QUEBEC", "ROMEO", "SIERRA", "TANGO", "UNIFORM", "VICTOR", "WHISKEY",
  17.             "X-RAY", "YANKEE", "ZULU"
  18.     );
  19.     private static final int SIZE = 4;
  20.     private int steps;
  21.     private final HanoiTower[] towers;
  22.  
  23.     public HanoiTowers() {
  24.         towers = new HanoiTower[]{new HanoiTower("SOURCE"), new HanoiTower("BUFFER"), new HanoiTower("RESULT")};
  25.         steps = 0;
  26.         towers[0].fill(STRINGS.subList(0, SIZE));
  27.     }
  28.  
  29.     public static void main(String[] args) {
  30.         HanoiTowers hanoiTowers = new HanoiTowers();
  31.         System.out.println("start position:\n" + hanoiTowers);
  32.  
  33.         hanoiTowers.runTask();
  34.         System.out.println("finish position:\n" + hanoiTowers);
  35.     }
  36.  
  37.     private void runTask() {
  38.         towers[0].moveAll(towers[1], towers[2], towers[0].size(), this);
  39.         System.out.printf("%nmoving %d elements ................ %d steps%n", SIZE, steps);
  40.     }
  41.  
  42.     @Override
  43.     public String toString() {
  44.         if (towers.length != 3)
  45.             throw new RuntimeException();
  46.         return String.format("%s%n%s%n%s", towers[0].toString(), towers[1].toString(), towers[2].toString());
  47.     }
  48.  
  49.     class HanoiTower {
  50.  
  51.         private final String name;
  52.         private final Deque<String> content = new LinkedList<>();
  53.  
  54.         HanoiTower(String name) {
  55.             this.name = name;
  56.         }
  57.  
  58.         void moveElement(HanoiTower fromTower, HanoiTowers hanoiTowers) {
  59.             String element = fromTower.content.pollLast();
  60.             content.addLast(element);
  61.             System.out.printf("%nmoving %s from %s to %s:%n%s%n", element, fromTower.name, this.name, hanoiTowers);
  62.         }
  63.  
  64.         private void moveAll(HanoiTower buffer, HanoiTower result, int amount, HanoiTowers hanoiTowers) {
  65.             if (amount == 0) {
  66.                 return;
  67.             }
  68.             steps++;
  69.             amount--;
  70.             this.moveAll(result, buffer, amount, hanoiTowers);
  71.             result.moveElement(this, hanoiTowers);
  72.             buffer.moveAll(this, result, amount, hanoiTowers);
  73.         }
  74.  
  75.         void fill(Collection<String> elements) {
  76.             content.clear();
  77.             content.addAll(elements);
  78.         }
  79.  
  80.         int size() {
  81.             return content.size();
  82.         }
  83.  
  84.         @Override
  85.         public String toString() {
  86.             return String.format(" %s: %s", name, content);
  87.         }
  88.     }
  89. }
  90.  
Add Comment
Please, Sign In to add comment