Hur implementerar man en problemlösare för vattenkanna i Java?

Dec 18, 2025

Lämna ett meddelande

Som leverantör av vattenkannor har jag alltid varit fascinerad av de praktiska och teoretiska aspekterna av vattenkannor. Ett intressant teoretiskt problem som har verkliga konsekvenser är problemet med vattenkanna. I den här bloggen kommer jag att guida dig genom att implementera en problemlösare för vattenkanna i Java.

Förstå problemet med vattenkanna

Problemet med vattenkanna är ett klassiskt pussel. Du får två kannor med kapacitet (x) och (y) liter, och ett mål att mäta (z) liter vatten. De operationer du kan utföra är:

  1. Fyll en kanna helt.
  2. Töm en kanna.
  3. Häll vatten från den ena kannan till den andra tills antingen källkannan är tom eller destinationskannan är full.

Målet är att hitta en sekvens av dessa operationer som kommer att resultera i att ha (z) liter vatten i en av kannorna.

Java-implementering av problemlösaren för vattenkannan

Låt oss börja med att skapa en klass för att representera kannornas tillstånd.

class JugState { int jug1; int kanna2; public JugState(int kanna1, int kanna2) { this.jug1 = kanna1; this.jug2 = kanna2; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) returnerar false; JugState jugState = (JugState) o; returnera kanna1 == jugState.jug1 && kanna2 == jugState.jug2; } @Override public int hashCode() { return 31 * jug1 + jug2; } @Override public String toString() { return "Jug1: " + jug1 + ", Jug2: " + jug2; } }

DettaJugStateklass representerar den aktuella mängden vatten i varje kanna. Vi åsidosätterlikaochhashCodemetoder för att kunna använda dessa tillstånd i datastrukturer somHashSet.

Därefter kommer vi att implementera huvudlösarklassen.

importera java.util.*; public class WaterJugSolver { privat int kapacitet1; privat int kapacitet2; privat int mål; public WaterJugSolver(int kapacitet1, int kapacitet2, int mål) { this.capacity1 = kapacitet1; denna.kapacitet2 = kapacitet2; this.target = mål; } public List<JugState> solve() { Queue<List<JugState>> queue = new LinkedList<>(); Set<JugState> besökt = new HashSet<>(); JugState initialState = new JugState(0, 0); List<JugState> initialPath = new ArrayList<>(); initialPath.add(initialState); queue.add(initialPath); visited.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); för (JugState nextState: nextStates) { if (!visited.contains(nextState)) { List<JugState> newPath = new ArrayList<>(currentPath); newPath.add(nextState); queue.add(newPath); visited.add(nextState); } } } returnera null; } privat lista<JugState> getNextStates(JugState currentState) { List<JugState> nextStates = new ArrayList<>(); // Fyll kanna 1 nextStates.add(new JugState(capacity1, currentState.jug2)); // Fyll kanna 2 nextStates.add(new JugState(currentState.jug1, capacity2)); // Empty jug 1 nextStates.add(new JugState(0, currentState.jug2)); // Empty jug 2 nextStates.add(new JugState(currentState.jug1, 0)); // Häll från kanna 1 till kanna 2 int pourAmount = Math.min(currentState.jug1, capacity2 - currentState.jug2); nextStates.add(new JugState(currentState.jug1 - pourAmount, currentState.jug2 + pourAmount)); // Häll från kanna 2 till kanna 1 pourAmount = Math.min(currentState.jug2, capacity1 - currentState.jug1); nextStates.add(new JugState(currentState.jug1 + pourAmount, currentState.jug2 - pourAmount)); returnera nästaStater; } public static void main(String[] args) { WaterJugSolver solver = new WaterJugSolver(3, 5, 4); List<JugState> lösning = solver.solve(); if (lösning != null) { för (JugState-tillstånd: lösning) { System.out.println(state); } } else { System.out.println("Ingen lösning hittades."); } } }

I denWaterJugSolverklass använder vi en bredd - första sökning (BFS) algoritm för att hitta lösningen. Delösametoden initierar en kö för att lagra sökvägarna och en uppsättning för att hålla reda på besökta tillstånd. Vi börjar med att initialtillståndet för båda kannorna är tomma.

DegetNextStates-metoden genererar alla möjliga nästa tillstånd från det aktuella tillståndet genom att utföra de sex operationer som nämnts tidigare.

Verkliga tillämpningar och våra vattenkannor

Problemet med vattenkanna kan verka som ett enkelt pussel, men det har tillämpningar inom områden som resurshantering och optimering. Inom ramen för vår verksamhet med vattenkannor kan förståelse av dessa algoritmer hjälpa till i scenarier som att fylla storskaliga vattenbehållare effektivt.

Vi erbjuder ett brett utbud av vattenkannor för att möta olika behov. För utomhusaktiviteter, vårUtomhusvattenkanna i rostfritt stål med stor kapacitetär ett utmärkt val. Den kan hålla en betydande mängd vatten, vilket säkerställer att du håller dig hydrerad under långa vandringar eller campingturer.

Om du behöver ett mer bärbart alternativ, vårRostfritt stål 64oz bärbar kannaär perfekt. Den är lätt att bära med sig, oavsett om du ska till gymmet eller springa ärenden.

För dig som behöver ännu mer vattenförvaring, vårRostfritt stål 64oz 128oz gallon vattenflaskager den kapacitet du behöver.

Stainless Steel 64oz Portable Jug priceStainless Steel 64oz Portable Jug factory

Slutsats

Att implementera en problemlösare för vattenkanna i Java är ett utmärkt sätt att förstå algoritmer som BFS och hur de kan tillämpas på verkliga problem. Som leverantör av vattenkannor har vi åtagit oss att tillhandahålla produkter av hög kvalitet som uppfyller dina behov av vattenlagring.

Om du är intresserad av att köpa våra vattenkannor eller har några frågor om våra produkter, uppmuntrar vi dig att ta kontakt för en upphandlingsdiskussion. Vi är här för att hjälpa dig att hitta den perfekta vattenkannalösningen för dina behov.

Referenser

  • Introduktion till algoritmer av Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • Datastrukturer och algoritmer i Java av Robert Lafore
Skicka förfrågan
Kontakta ossom har någon fråga

Du kan antingen kontakta oss via telefon, e-post eller onlineformulär nedan. Vår specialist kommer att kontakta dig inom kort.

Kontakta nu!