Kao dobavljač vrčeva za vodu, oduvijek su me fascinirali praktični i teorijski aspekti vrčeva za vodu. Jedan zanimljiv teorijski problem koji ima implikacije u stvarnom svijetu je problem vrča za vodu. U ovom blogu ću vas voditi kroz implementaciju rješavača problema s bokalom za vodu u Javi.
Razumijevanje problema vrča za vodu
Problem vrča za vodu je klasična zagonetka. Dobijate dva vrča kapaciteta (x) i (y) litara, i cilj mjerenja (z) litara vode. Operacije koje možete izvesti su:
- Potpuno napunite bokal.
- Ispraznite vrč.
- Sipajte vodu iz jednog vrča u drugi dok se ili izvorni vrč ne isprazni ili odredišni vrč ne napuni.
Cilj je pronaći slijed ovih operacija koji će rezultirati (z) litara vode u jednom od vrčeva.
Java implementacija rješenja za rješavanje problema s vrčem za vodu
Počnimo kreiranjem klase koja predstavlja stanje vrčeva.
class JugState { int jug1; int jug2; public JugState(int jug1, int jug2) { this.jug1 = jug1; this.jug2 = vrč2; } @Override public boolean equals(Object o) { if (ovo == o) vrati true; if (o == null || getClass() != o.getClass()) vrati 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; } }
OvoJugStateklasa predstavlja trenutnu količinu vode u svakom vrču. Mi poništavamojednakiihashCodemetode da se ta stanja mogu koristiti 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<>(); Set<JugState> posjećeno = novi 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); 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<>(); // Napuni vrč 1 nextStates.add(new JugState(capacity1, currentState.jug2)); // Napuni vrč 2 nextStates.add(new JugState(currentState.jug1, kapacitet2)); // Prazan vrč 1 nextStates.add(new JugState(0, currentState.jug2)); // Prazan vrč 2 nextStates.add(new JugState(currentState.jug1, 0)); // Izlivanje iz vrča 1 u vrč 2 int pourAmount = Math.min(currentState.jug1, kapacitet2 - currentState.jug2); nextStates.add(new JugState(currentState.jug1 - pourAmount, currentState.jug2 + pourAmount)); // Izlivanje 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)); return 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(state); } } else { System.out.println("Nije pronađeno rješenje."); } } }
UWaterJugSolverklase, koristimo algoritam prve pretrage (BFS) da pronađemo rješenje. Theriješitimetoda inicijalizira red za pohranjivanje staza i skup za praćenje posjećenih stanja. Počinjemo s početnim stanjem da su oba vrča prazna.
ThegetNextStatesmetoda generiše sva moguća sljedeća stanja iz trenutnog stanja izvođenjem šest ranije spomenutih operacija.
Stvarne primjene i naši vrčevi za vodu
Problem vrča 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 sa vrčevima za vodu, razumijevanje ovih algoritama može pomoći u scenarijima kao što je efikasno punjenje velikih kontejnera za vodu.
Nudimo širok asortiman vrčeva za vodu za različite potrebe. Za aktivnosti na otvorenom, našVanjski vrč za vodu od nehrđajućeg čelika velikog kapacitetaje odličan izbor. Može zadržati značajnu količinu vode, osiguravajući da ostanete hidrirani tokom dugih planinarenja ili kampiranja.
Ako vam je potrebna prenosiva opcija, našaPrijenosni vrč od nehrđajućeg čelika od 64 ozje savršeno. Lako ga je nositi sa sobom, bilo da idete u teretanu ili obavljate poslove.
Za one kojima je potrebno još više vode, našBoca za vodu od nehrđajućeg čelika 64oz 128oz Galonapruža kapacitet koji vam je potreban.


Zaključak
Implementacija rješavača problema sa vrčem za vodu u Javi je odličan način da se razumiju algoritmi poput BFS-a i kako se oni mogu primijeniti na probleme u stvarnom svijetu. Kao dobavljač vrčeva za vodu, posvećeni smo pružanju visokokvalitetnih proizvoda koji zadovoljavaju vaše potrebe za skladištenjem vode.
Ako ste zainteresirani za kupovinu naših vrčeva za vodu ili imate bilo kakva pitanja o našim proizvodima, preporučujemo vam da se obratite za raspravu o nabavci. Tu smo da vam pomognemo da pronađete savršeno rješenje za bokal 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 Roberta Lafora
