Kako implementirati rješavanje problema vrča za vodu u Javi?

Dec 18, 2025

Ostavite poruku

Kao dobavljača vrčeva za vodu, uvijek sam bio fasciniran praktičnim i teoretskim aspektima vrčeva za vodu. Jedan zanimljiv teorijski problem koji ima implikacije u stvarnom svijetu je problem vrča za vodu. U ovom blogu vodit ću vas kroz implementaciju rješavača problema vrča za vodu u Javi.

Razumijevanje problema vrča za vodu

Problem s vrčem za vodu je klasična zagonetka. Dobivate dva vrča zapremine (x) i (y) litara i objektiv za mjerenje (z) litara vode. Operacije koje možete izvesti su:

  1. Napunite vrč do kraja.
  2. Ispraznite vrč.
  3. Prelijevajte vodu iz jednog vrča u drugi sve dok izvorni vrč ne bude prazan ili odredišni vrč ne bude pun.

Cilj je pronaći slijed ovih operacija koji će rezultirati u (z) litara vode u jednom od vrčeva.

Java implementacija rješenja problema vrča za vodu

Počnimo stvaranjem klase koja će predstavljati stanje vrčeva.

class JugState { int jug1; int vrč2; public JugState(int jug1, int jug2) { this.jug1 = jug1; this.jug2 = vrč2; } @Override public boolean equals(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; }}

OvajJugStateklasa predstavlja trenutnu količinu vode u svakom vrču. ZaobilazimojednakiihashCodemetode za korištenje ovih stanja u strukturama podataka kao što suHashSet.

Zatim ćemo implementirati glavnu klasu rješavača.

import java.util.*; public class WaterJugSolver { private int kapacitet1; privatni int kapacitet2; privatni int cilj; public WaterJugSolver(int kapacitet1, int kapacitet2, int cilj) { this.capacity1 = kapacitet1; this.capacity2 = kapacitet2; this.target = cilj; } public List<JugState> solve() { Queue<List<JugState>> queue = new LinkedList<>(); Posjetio<JugState> = novi HashSet<>(); JugState initialState = novo JugState(0, 0); List<JugState> initialPath = new ArrayList<>(); početniput.dodaj(početnoStanje); queue.add(inicijalniput); 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); for (JugState nextState : nextStates) { if (!visited.contains(nextState)) { List<JugState> newPath = new ArrayList<>(currentPath); newPath.add(nextState); queue.add(newPath); visited.add(nextState); } } } return null; } private List<JugState> getNextStates(JugState currentState) { List<JugState> nextStates = new ArrayList<>(); // Napunite vrč 1 nextStates.add(new JugState(capacity1, currentState.jug2)); // Napunite vrč 2 nextStates.add(novo JugState(currentState.jug1, kapacitet2)); // Prazni vrč 1 nextStates.add(new JugState(0, currentState.jug2)); // Prazni vrč 2 nextStates.add(novo JugState(currentState.jug1, 0)); // Prelij iz vrča 1 u vrč 2 int pourAmount = Math.min(currentState.jug1, kapacitet2 - currentState.jug2); nextStates.add(novo JugState(currentState.jug1 - pourAmount, currentState.jug2 + pourAmount)); // Prelij iz vrča 2 u vrč 1 pourAmount = Math.min(currentState.jug2, kapacitet1 - currentState.jug1); nextStates.add(new JugState(currentState.jug1 + pourAmount, currentState.jug2 - pourAmount)); vratiti nextStates; } public static void main(String[] args) { WaterJugSolver solver = new WaterJugSolver(3, 5, 4); List<JugState> rješenje = solver.solve(); if (rješenje != null) { for (JugState stanje : rješenje) { System.out.println(stanje); } } else { System.out.println("Nije pronađeno rješenje."); } } }

uWaterJugSolverklase, koristimo algoritam prve pretrage u širinu (BFS) za pronalaženje rješenja. Theriješitimetoda inicijalizira red čekanja za pohranu staza i skup za praćenje posjećenih stanja. Počinjemo s početnim stanjem oba vrča koji su prazni.

ThegetNextStatesmetoda generira sva moguća sljedeća stanja iz trenutnog stanja izvodeći šest ranije spomenutih operacija.

Primjene u stvarnom svijetu i naši vrčevi za vodu

Problem s vrčem za vodu može izgledati kao jednostavna zagonetka, ali ima primjenu u područjima kao što su upravljanje resursima i optimizacija. U kontekstu našeg poslovanja s vrčevima za vodu, razumijevanje ovih algoritama može pomoći u scenarijima poput učinkovitog punjenja velikih spremnika za vodu.

Nudimo širok izbor vrčeva za vodu koji zadovoljavaju različite potrebe. Za aktivnosti na otvorenom, našVanjski vrč za vodu velikog kapaciteta od nehrđajućeg čelikaje odličan izbor. Može zadržati značajnu količinu vode, osiguravajući da ostanete hidrirani tijekom dugih planinarenja ili kampiranja.

Ako trebate prijenosniju opciju, našPrijenosni vrč od nehrđajućeg čelika od 64 ozje savršen. Lako ga je nositi sa sobom, idete li u teretanu ili obavljate poslove.

Za one koji trebaju još više spremnika vode, našBoca vode od nehrđajućeg čelika od 64oz 128oz galonapruža kapacitet koji vam je potreban.

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

Zaključak

Implementacija rješavača problema s vrčem za vodu u Javi odličan je način za razumijevanje algoritama poput BFS-a i načina na koji se mogu primijeniti na probleme u stvarnom svijetu. Kao dobavljač vrčeva za vodu, predani smo pružanju visokokvalitetnih proizvoda koji zadovoljavaju vaše potrebe za skladištenjem vode.

Ako ste zainteresirani za kupnju naših vrčeva za vodu ili imate bilo kakvih pitanja o našim proizvodima, potičemo vas da se obratite radi rasprave o nabavi. Ovdje smo da vam pomognemo pronaći savršeno rješenje za vrč za vodu za vaše zahtjeve.

Reference

  • Uvod u algoritme Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • Strukture podataka i algoritmi u Javi Robert Lafore
Pošaljite upit
Kontaktirajte nasako imate bilo kakvih pitanja

Možete nas kontaktirati putem telefona, e-pošte ili online obrasca ispod. Naš stručnjak će vas uskoro kontaktirati.

Kontaktirajte odmah!