Als Anbieter von Wasserkrügen war ich schon immer von den praktischen und theoretischen Aspekten von Wasserkrügen fasziniert. Ein interessantes theoretisches Problem, das Auswirkungen auf die reale Welt hat, ist das Wasserkrugproblem. In diesem Blog führe ich Sie durch die Implementierung eines Wasserkrug-Problemlösers in Java.
Das Wasserkrug-Problem verstehen
Das Wasserkrugproblem ist ein klassisches Rätsel. Sie erhalten zwei Krüge mit einem Fassungsvermögen von (x) und (y) Litern und einem Ziel zum Abmessen von (z) Litern Wasser. Die Operationen, die Sie ausführen können, sind:
- Füllen Sie eine Kanne vollständig.
- Leeren Sie einen Krug.
- Gießen Sie Wasser von einer Kanne in die andere, bis entweder die Quellkanne leer oder die Zielkanne voll ist.
Das Ziel besteht darin, eine Abfolge dieser Vorgänge zu finden, die dazu führt, dass sich (z) Liter Wasser in einem der Krüge befinden.
Java-Implementierung des Water Jug Problem Solver
Beginnen wir mit der Erstellung einer Klasse, die den Zustand der Krüge darstellt.
Klasse JugState { int jug1; int jug2; public JugState(int jug1, int jug2) { this.jug1 = jug1; this.jug2 = jug2; } @Override public boolean equal(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; JugState jugState = (JugState) o; return jug1 == jugState.jug1 && jug2 == jugState.jug2; } @Override public int hashCode() { return 31 * jug1 + jug2; } @Override public String toString() { return "Jug1: " + jug1 + ", Jug2: " + jug2; } }
DasJugStateDie Klasse stellt die aktuelle Wassermenge in jedem Krug dar. Wir überschreiben dasgleichtUndHashCodeMethoden, um diese Zustände in Datenstrukturen wie verwenden zu könnenHashSet.
Als Nächstes implementieren wir die Hauptlöserklasse.
import java.util.*; öffentliche Klasse WaterJugSolver { private int Capacity1; private int-Kapazität2; privates int-Ziel; public WaterJugSolver(int Capacity1, int Capacity2, int Target) { this.capacity1 = Capacity1; this.capacity2 = Kapazität2; this.target = Ziel; } public List<JugState>solve() { Queue<List<JugState>> queue = new LinkedList<>(); Set<JugState> besuchte = new HashSet<>(); JugState initialState = new JugState(0, 0); List<JugState> initialPath = new ArrayList<>(); initialPath.add(initialState); queue.add(initialPath); besuchte.add(initialState); while (!queue.isEmpty()) { List<JugState> currentPath = queue.poll(); JugState currentState = currentPath.get(currentPath.size() - 1); if (currentState.jug1 == target || currentState.jug2 == target) { return currentPath; } List<JugState> nextStates = getNextStates(currentState); for (JugState nextState : nextStates) { if (!visited.contains(nextState)) { List<JugState> newPath = new ArrayList<>(currentPath); newPath.add(nextState); queue.add(newPath); besuchte.add(nextState); } } } return null; } private List<JugState> getNextStates(JugState currentState) { List<JugState> nextStates = new ArrayList<>(); // Krug 1 füllen nextStates.add(new JugState(capacity1, currentState.jug2)); // Kanne 2 füllen nextStates.add(new JugState(currentState.jug1, Capacity2)); // Krug leeren 1 nextStates.add(new JugState(0, currentState.jug2)); // Krug leeren 2 nextStates.add(new JugState(currentState.jug1, 0)); // Von Kanne 1 in Kanne 2 gießen int pourAmount = Math.min(currentState.jug1, Capacity2 - currentState.jug2); nextStates.add(new JugState(currentState.jug1 - pourAmount, currentState.jug2 + pourAmount)); // Von Kanne 2 in Kanne 1 gießen pourAmount = Math.min(currentState.jug2, Capacity1 - currentState.jug1); nextStates.add(new JugState(currentState.jug1 + pourAmount, currentState.jug2 - pourAmount)); return nextStates; } public static void main(String[] args) { WaterJugSolver Solver = new WaterJugSolver(3, 5, 4); List<JugState> Solution = Solver.solve(); if (solution != null) { for (JugState state :solution) { System.out.println(state); } } else { System.out.println("Keine Lösung gefunden."); } } }
ImWaterJugSolverKlasse verwenden wir einen Breiten-First-Suchalgorithmus (BFS), um die Lösung zu finden. DerlösenDie Methode initialisiert eine Warteschlange zum Speichern der Pfade und einen Satz zum Verfolgen der besuchten Zustände. Wir beginnen mit dem Ausgangszustand, in dem beide Kannen leer sind.
DergetNextStatesDie Methode generiert alle möglichen nächsten Zustände aus dem aktuellen Zustand, indem sie die sechs zuvor erwähnten Operationen ausführt.
Reale Anwendungen und unsere Wasserkrüge
Das Wasserkrug-Problem mag wie ein einfaches Rätsel erscheinen, aber es gibt Anwendungen in Bereichen wie Ressourcenmanagement und -optimierung. Im Zusammenhang mit unserem Geschäft mit Wasserkrügen kann das Verständnis dieser Algorithmen bei Szenarien wie dem effizienten Befüllen großer Wasserbehälter hilfreich sein.
Wir bieten eine große Auswahl an Wasserkrügen für unterschiedliche Bedürfnisse. Für Outdoor-Aktivitäten ist unserWasserkrug aus Edelstahl mit großem Fassungsvermögen für den Außenbereichist eine tolle Wahl. Es kann eine beträchtliche Menge Wasser aufnehmen und sorgt so dafür, dass Sie auch bei langen Wanderungen oder Campingausflügen hydriert bleiben.
Wenn Sie eine tragbarere Option benötigen, ist unsereTragbarer Krug aus Edelstahl mit einem Fassungsvermögen von 64 Unzenist perfekt. Es lässt sich leicht mitnehmen, egal ob Sie ins Fitnessstudio gehen oder Besorgungen machen.
Für diejenigen, die noch mehr Wasserspeicher benötigen, unserEdelstahl-Wasserflasche mit 64 Unzen und 128 Unzen Gallonenbietet die Kapazität, die Sie benötigen.


Abschluss
Die Implementierung eines Wasserkrug-Problemlösers in Java ist eine großartige Möglichkeit, Algorithmen wie BFS zu verstehen und zu verstehen, wie sie auf reale Probleme angewendet werden können. Als Lieferant von Wasserkrügen sind wir bestrebt, qualitativ hochwertige Produkte anzubieten, die Ihren Anforderungen an die Wasserspeicherung gerecht werden.
Wenn Sie am Kauf unserer Wasserkrüge interessiert sind oder Fragen zu unseren Produkten haben, empfehlen wir Ihnen, sich an ein Beschaffungsgespräch zu wenden. Wir sind hier, um Ihnen zu helfen, die perfekte Wasserkruglösung für Ihre Anforderungen zu finden.
Referenzen
- Einführung in Algorithmen von Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
- Datenstrukturen und Algorithmen in Java von Robert Lafore
