💧 Ο Αλγόριθμος Λύσης

Το Πρόβλημα

Δίνονται δύο δοχεία χωρητικότητας Α και Β λίτρων και μια πηγή με άφθονο νερό. Επιτρέπονται μόνο τρεις ενέργειες: γέμισμα ενός δοχείου μέχρι πάνω, άδειασμά του εντελώς, και μεταφορά νερού από το ένα στο άλλο μέχρι να γεμίσει ή να αδειάσει το πηγαίο.

Ζητείται να μετρήσουμε ακριβώς Στόχος λίτρα σε κάποιο από τα δύο δοχεία.

Πότε Λύνεται — Πότε Όχι

Το πρόβλημα έχει λύση αν και μόνο αν ο στόχος είναι πολλαπλάσιος του Μέγιστου Κοινού Διαιρέτη (ΜΚΔ) των δύο χωρητικοτήτων, και δεν υπερβαίνει το μέγιστο από τα δύο δοχεία.
Λύση υπάρχει ⟺ (Στόχος % ΜΚΔ(Α, Β) = 0) AND (Στόχος ≤ max(Α, Β))
⚠️ Παραδείγματα χωρίς λύση:
• Δοχεία 6 και 4 (ΜΚΔ=2): στόχος 3 → αδύνατο
• Δοχεία 6 και 4 (ΜΚΔ=2): στόχος 5 → αδύνατο
• Δοχεία 3 και 6 (ΜΚΔ=3): στόχος 4 → αδύνατο
• Οποιαδήποτε δοχεία: στόχος > μέγιστο δοχείο → αδύνατο

Ο Αλγόριθμος (BFS / Εξαντλητική Αναζήτηση)

Η γενική μέθοδος αντιμετωπίζει το πρόβλημα ως αναζήτηση γράφου. Κάθε κατάσταση είναι ένα ζεύγος (waterA, waterB) και οι ακμές είναι οι έξι δυνατές ενέργειες. Χρησιμοποιούμε BFS (Breadth-First Search) για να βρούμε το συντομότερο μονοπάτι από (0, 0) στην πρώτη κατάσταση που περιέχει τον στόχο.

  • Ξεκινάμε από (0, 0) και προσθέτουμε στην ουρά.
  • Για κάθε κατάσταση εφαρμόζουμε και τις 6 ενέργειες.
  • Αν η νέα κατάσταση δεν έχει επισκεφθεί, την προσθέτουμε.
  • Σταματάμε όταν βρούμε κατάσταση με waterA = Στόχος ή waterB = Στόχος.
  • Το BFS εγγυάται ότι βρίσκουμε τη λύση με τις λιγότερες κινήσεις.

Η «Αριθμητική» Μέθοδος (Εκτεταμένος Αλγόριθμος Euclid)

Υπάρχει και αναλυτική κατανόηση: με επαναλαμβανόμενο γέμισμα του Α και άδειασμα στο Β (ή αντίστροφα), παράγουμε όλα τα πολλαπλάσια του ΜΚΔ(Α,Β) μέχρι το lcm(Α,Β). Αυτό είναι η ουσία του θεωρήματος Bézout: υπάρχουν ακέραιοι x,y ώστε:

x·Α + y·Β = ΜΚΔ(Α, Β)

Άρα κάθε πολλαπλάσιο του ΜΚΔ είναι εφικτό. Η πρακτική εφαρμογή:

  • Στρατηγική Α→Β: Γέμισε Α, άδειασε στο Β. Όταν γεμίσει το Β, άδειασέ το εντελώς. Επανάλαβε.
  • Στρατηγική Β→Α: Το ίδιο ξεκινώντας από Β. Συχνά δίνει διαφορετικό πλήθος κινήσεων.

Παραδείγματα

ΔοχείαΣτόχοςΜΚΔΛύση;Ελάχ. Κινήσεις
5 και 34 lt1✅ Ναι6
7 και 56 lt1✅ Ναι8
10 και 79 lt1✅ Ναι
6 και 42 lt2✅ Ναι2
6 και 43 lt2❌ Όχι
9 και 64 lt3❌ Όχι

Πολυπλοκότητα

Ο χώρος καταστάσεων έχει (Α+1)×(Β+1) κόμβους, άρα ο BFS τρέχει σε O(Α·Β) χρόνο και μνήμη — πρακτικά στιγμιαίο για τα μεγέθη του παιχνιδιού.

💧 Πρόβλημα Δοχείων Νερού

🏆
— Κανείς ακόμα —
Κλικ για κατάταξη
⏱ 0:00
Στόχος: Κινήσεις: 0
Δοχείο Α
0 lt
/ 5 lt
Δοχείο Β
0 lt
/ 3 lt
🚰 Βρύση = γέμισμα  |  🔴 Κάνουλα = άδειασμα  |  🔁 Βέλη Α→Β / Β→Α = μεταφορά νερού

📋 Ιστορικό

ΕντολήΑΒ
0Αρχή
0 0

⚙ Ρυθμίσεις

🏆
Μπράβο!
🚫
Αδύνατο!

🏆 Κατάταξη Παικτών