Advertisement
Guest User

wuerfelturm

a guest
Jul 17th, 2023
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.15 KB | Source Code | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.HashSet;
  4.  
  5. /**
  6.  * Die Main Klasse fragt die Eingabe ab und ruft die Rekursion zur Loesung auf.
  7.  */
  8. public class Main {
  9.  
  10.     /**
  11.      * main-Methode
  12.      * @param args nicht genutzt
  13.      */
  14.     public static void main(String args[]) {
  15.         Wuerfelturm turm = new Wuerfelturm();
  16.          for (int i = 0; i < 4; i++)
  17.              while (true) {
  18.                  try {
  19.                      System.out.println("Bitte geben Sie vier Würfel mit der jeweils gewünschten Farbkombination ein. \n" +
  20.                              "Zur Auswahl stehen die folgenden vier Farben: \n" + "*rot\n" + "*blau\n" + "*grün\n" + "*gelb\n" +
  21.                              "\n" + "Bitte trennen Sie die Farben mit jeweils einem Leerzeichen. \n" + "Ihre Eingabe:\n");
  22.                      // Eingaben hier mit Scanner einfügen (Exceptions auffangen)
  23.                      // String eingabeTop = ;
  24.                      // String eingabeSeiten = ;
  25.                      // String[] eingabeSeitenSplit = eingabeSeiten.split(" ");
  26.                      // String eingabeBottom = ;
  27.  
  28.                      String[] eingabeFarben = new String[6];
  29.                      eingabeFarben[0] = eingabeTop;
  30.                      eingabeFarben[1] = eingabeSeitenSplit[0];
  31.                      eingabeFarben[2] = eingabeSeitenSplit[1];
  32.                      eingabeFarben[3] = eingabeSeitenSplit[2];
  33.                      eingabeFarben[4] = eingabeSeitenSplit[3];
  34.                      eingabeFarben[5] = eingabeBottom;
  35.  
  36.                      if (!(Wuerfel.getFarbe().contains(eingabeFarben[0]))) {
  37.                          System.out.println("Sie haben einen Fehler bei 'Top' gemacht. Bitte überprüfen Sie Ihre Eingabe bezüglich Rechtschreibung und Leerzeichen.\n");
  38.                          continue;
  39.                      }
  40.  
  41.                      if (!(Wuerfel.getFarbe().contains(eingabeFarben[1]) && Wuerfel.getFarbe().contains(eingabeFarben[2]) &&
  42.                              Wuerfel.getFarbe().contains(eingabeFarben[3]) && Wuerfel.getFarbe().contains(eingabeFarben[4]))) {
  43.                          System.out.println("Sie haben einen Fehler bei 'Seiten' gemacht. Bitte überprüfen Sie Ihre Eingabe bezüglich Rechtschreibung und Leerzeichen.\n");
  44.                          continue;
  45.                      }
  46.  
  47.                      if (!(Wuerfel.getFarbe().contains(eingabeFarben[5]))) {
  48.                          System.out.println("Sie haben einen Fehler bei 'Bottom' gemacht. Bitte überprüfen Sie Ihre Eingabe bezüglich Rechtschreibung und Leerzeichen.\n");
  49.                          continue;
  50.                      }
  51.                      turm.neuerWuerfel(new Wuerfel(eingabeTop, new ArrayList<String>(Arrays.asList(eingabeSeitenSplit[0],
  52.                              eingabeSeitenSplit[1], eingabeSeitenSplit[2], eingabeSeitenSplit[3])), eingabeBottom), i);
  53.                      break;
  54.  
  55.                  } catch (ArrayIndexOutOfBoundsException e) {
  56.                      System.out.println("Sie haben einen Fehler gemacht. Bitte überprüfen Sie Ihre Eingabe bezüglich Rechtschreibung und Leerzeichen.\n +" +
  57.                              "Bitte beachten Sie, dass Sie bei Top und Bottom jeweils eine Farbe und bei Seiten genau vier Farben angeben müssen.\n");
  58.                  }
  59.              }
  60.         HashSet<String> visitedTowers = new HashSet<>();
  61.         HashSet<String> visitedTowersFull = new HashSet<>();
  62.  
  63.         turm.sortRecursive(0,0, visitedTowers, visitedTowersFull);
  64.     }
  65. }
  66.  
  67.  
  68. import java.util.ArrayList;
  69. import java.util.HashSet;
  70.  
  71. /**
  72.  * Die Wurfel Klasse beschreibt einen Wuerfel
  73.  */
  74. public class Wuerfel {
  75.  
  76.     private static HashSet<String> farbe = new HashSet(){{
  77.         add("rot");
  78.         add("blau");
  79.         add("grün");
  80.         add("gelb");
  81.     }};
  82.     private ArrayList<String> seite = new ArrayList<>();
  83.     private String top;
  84.     private String bottom;
  85.     private int state;
  86.  
  87.     /**
  88.      * Konstruktor der Wuerfel Klasse
  89.      * @param top Oberseite des Wuerfels
  90.      * @param seite Seitenflaechen des Wuerfels (eins, zwei, drei, vier)
  91.      * @param bottom Unterseite des Wuerfels
  92.      */
  93.     public Wuerfel(String top, ArrayList<String> seite, String bottom) {
  94.         this.top = top;
  95.         this.seite = seite;
  96.         this.bottom = bottom;
  97.         this.state = 1;
  98.     }
  99.  
  100.     /**
  101.      * Getter fuer Seitenflaechen
  102.      * @return Seitenflaechen des Wuerfels
  103.      */
  104.     public ArrayList<String> getSeite() {
  105.         return seite;
  106.     }
  107.  
  108.     /**
  109.      * Gibt moegliche Farbwerte fuer einen Wuerfel zurueck
  110.      * @return
  111.      */
  112.     public static HashSet<String> getFarbe() {
  113.         return farbe;
  114.     }
  115.  
  116.     /**
  117.      * Gibt alle Wuerfelseiten als ein String zurueck
  118.      * @return alle Wuerfelseiten (oben, eins, zwei, drei, vier, unten)
  119.      */
  120.     @Override public String toString() {
  121.         StringBuilder wuerfelString = new StringBuilder();
  122.         wuerfelString.append(top).append("\n").append(seite).append("\n").append(bottom);
  123.         return wuerfelString.toString();
  124.     }
  125.  
  126.     /**
  127.      * Gibt nur die vier Seitenflaechen des Wuerfels als ein String zurueck
  128.      * @return vier Wuerfelseitenflaechen
  129.      */
  130.     public String toStringSeiten() {
  131.         return String.valueOf(seite);
  132.     }
  133.  
  134.  
  135.     /**
  136.      * dreht den Wuerfel
  137.      */
  138.     private void drehen() {
  139.         seite.add(seite.get(0));
  140.         seite.remove(seite.get(0));
  141.     }
  142.  
  143.     /**
  144.      * kippt den Wuerfel
  145.      */
  146.     private void kippen() {
  147.         String temp = this.top;
  148.         this.top = this.seite.get(2);
  149.         this.seite.set(2, this.bottom);
  150.         this.bottom = this.seite.get(0);
  151.         this.seite.set(0, temp);
  152.     }
  153.  
  154.     /**
  155.      * Rotiert den Wuerfel in alle 24 moeglichen Orientierungen
  156.      */
  157.     public void rotate() {
  158.         if (this.state < 4) {
  159.             this.drehen();
  160.             state++;
  161.         } else if (this.state == 4) {
  162.             this.kippen();
  163.             state++;
  164.         } else if (this.state < 8) {
  165.             this.drehen();
  166.             state++;
  167.         } else if (this.state == 8) {
  168.             this.kippen();
  169.             state++;
  170.         } else if (this.state < 12) {
  171.             this.drehen();
  172.             state++;
  173.         } else if (this.state == 12) {
  174.             this.drehen();
  175.             this.kippen();
  176.             state++;
  177.         } else if (this.state < 16) {
  178.             this.drehen();
  179.             state++;
  180.         } else if (this.state == 16) {
  181.             this.drehen();
  182.             this.kippen();
  183.             state++;
  184.         } else if (this.state < 20) {
  185.             this.drehen();
  186.             state++;
  187.         } else if (this.state == 20) {
  188.             this.drehen();
  189.             this.drehen();
  190.             this.kippen();
  191.             state++;
  192.         } else if (this.state < 24) {
  193.             this.drehen();
  194.             state++;
  195.         } else if (this.state == 24) {
  196.             this.drehen();
  197.             this.kippen();
  198.             this.kippen();
  199.             this.state = 1;
  200.         }
  201.     }
  202. }
  203.  
  204.  
  205. import java.util.HashSet;
  206.  
  207. /**
  208.  * Die Wurfelturm Klasse enthaelt die Logik zur Loesung des Wuerfelturms.
  209.  */
  210. public class Wuerfelturm {
  211.     private Wuerfel[] turm = new Wuerfel[4];
  212.     public void neuerWuerfel(Wuerfel wuerfel, int index){
  213.         this.turm[index] = wuerfel;
  214.     }
  215.  
  216.     /**
  217.      * Rekursive Methode zur Loesung des Wuerfelturms
  218.      * @param wuerfel index des Wuerfels
  219.      * @param rotationen Anzahl der Rotationen eines Wuerfels
  220.      * @param visitedTowers bereits gespeicherte Loesungen ohne TOP und BOTTOM Seite
  221.      * @param visitedTowersFull bereits gespeicherte Loesungen mit TOP und BOTTOM Seite
  222.      */
  223.     public void sortRecursive(int wuerfel, int rotationen, HashSet<String> visitedTowers, HashSet<String> visitedTowersFull) {
  224.         if (this.isValid()) {
  225.             String towerString = this.toString();
  226.             String towerStringWithoutTopAndBot = this.getTowerStringIgnoringTopAndBottom();
  227.             if (!visitedTowers.contains(towerStringWithoutTopAndBot) && !visitedTowersFull.contains(towerString) ) {
  228.                 visitedTowers.add(towerStringWithoutTopAndBot);
  229.                 visitedTowersFull.add(towerString);
  230.                 System.out.println(towerString);
  231.             }
  232.         }
  233.  
  234.         if (rotationen < 24) {
  235.             if (wuerfel < 3) {
  236.                 for (int i = 0; i < 24; i++) {
  237.                     this.turm[wuerfel].rotate();
  238.                     sortRecursive(wuerfel + 1, 0, visitedTowers, visitedTowersFull);
  239.                 }
  240.             } else {
  241.                 this.turm[wuerfel].rotate();
  242.                 sortRecursive(wuerfel, rotationen + 1, visitedTowers, visitedTowersFull);
  243.             }
  244.         }
  245.     }
  246.  
  247.     /**
  248.      * Methode zur Ueberpruefung einer Loesung
  249.      * @return ist der Wuerfelturm eine echte Loesung
  250.      */
  251.     private boolean isValid() {
  252.         HashSet<String> farben = new HashSet<>();
  253.         for (int i = 0; i < 4; i++) {
  254.             for (int k = 0; k < 4; k++) {
  255.                 if (!farben.contains(turm[k].getSeite().get(i))) {
  256.                     farben.add(turm[k].getSeite().get(i));
  257.                 } else {
  258.                     return false;
  259.                 }
  260.             }
  261.             farben.clear();
  262.         }
  263.         return true;
  264.     }
  265.  
  266.     /**
  267.      * Methode zur Ausgabe des aktuellen Zustands des Wuerfelturms
  268.      * @return Zeichenkette des Wuerfelturms
  269.      */
  270.     public String toString() {
  271.         StringBuilder result = new StringBuilder();
  272.         result.append("###########").append("\n");
  273.         for (int i = 0; i < 4; i++) {
  274.             result.append("\n").append(this.turm[i].toString()).append("\n");
  275.         }
  276.         result.append("\n");
  277.         return result.toString();
  278.     }
  279.     /**
  280.      * Methode zur Ausgabe des aktuellen Zustands des Wuerfelturms ohne TOP und BOTTOM Seiten der Wuerfel
  281.      * @return Zeichenkette des Wuerfelturms
  282.      */
  283.     private String getTowerStringIgnoringTopAndBottom() {
  284.         StringBuilder result = new StringBuilder();
  285.         for (int i = 1; i < 4; i++) {
  286.             result.append(this.turm[i].toStringSeiten());
  287.         };
  288.         return result.toString();
  289.     }
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement