Sebagai pemasok kendi air, saya selalu terpesona dengan aspek praktis dan teoritis dari kendi air. Salah satu masalah teoretis menarik yang mempunyai implikasi dunia nyata adalah masalah kendi air. Di blog ini, saya akan memandu Anda menerapkan pemecah masalah kendi air di Java.
Memahami Masalah Kendi Air
Masalah kendi air adalah teka-teki klasik. Anda diberikan dua buah kendi dengan kapasitas (x) dan (y) liter, dan sebuah tujuan untuk mengukur (z) liter air. Operasi yang dapat Anda lakukan adalah:
- Isi kendi hingga penuh.
- Kosongkan kendi.
- Tuangkan air dari satu kendi ke kendi lainnya hingga kendi sumber kosong atau kendi tujuan penuh.
Tujuannya adalah untuk menemukan urutan operasi ini yang akan menghasilkan (z) liter air di salah satu kendi.
Implementasi Java dari Pemecah Masalah Kendi Air
Mari kita mulai dengan membuat kelas untuk mewakili keadaan kendi.
kelas JugState { int kendi1; int kendi2; public JugState(int jug1, int jug2) { ini.jug1 = jug1; ini.jug2 = kendi2; } @Override public boolean sama dengan(Objek o) { jika (ini == o) mengembalikan nilai true; if (o == null || getClass() != o.getClass()) mengembalikan 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; } }
IniNegara Bagian Jugkelas mewakili jumlah air saat ini di setiap kendi. Kami mengesampingkansamaDankode hashmetode untuk dapat menggunakan status ini dalam struktur data sepertiSet Hash.
Selanjutnya, kita akan mengimplementasikan kelas pemecah utama.
import java.util.*; kelas publik WaterJugSolver { private int capacity1; kapasitas int pribadi2; target int swasta; public WaterJugSolver(int capacity1, int capacity2, int target) { this.capacity1 = capacity1; this.capacity2 = kapasitas2; this.target = sasaran; } Daftar publik<JugState> solve() { Antrian<Daftar<JugState>> antrian = LinkedList baru<>(); Set<JugState> dikunjungi = HashSet baru<>(); JugState inisialState = JugState baru(0, 0); Daftar<JugState> initialPath = ArrayList baru<>(); initialPath.add(initialState); antrian.tambahkan(initialPath); dikunjungi.tambahkan(initialState); while (!queue.isEmpty()) { Daftar<JugState> currentPath = antrian.poll(); JugState currentState = currentPath.get(currentPath.size() - 1); if (currentState.jug1 == target || currentState.jug2 == target) { return currentPath; } Daftar<JugState> nextStates = getNextStates(currentState); for (JugState nextState : nextStates) { if (!visited.contains(nextState)) { Daftar<JugState> newPath = new ArrayList<>(currentPath); newPath.add(nextState); antrian.add(newPath); dikunjungi.tambahkan(nextState); } } } mengembalikan nol; } Daftar pribadi<JugState> getNextStates(JugState currentState) { Daftar<JugState> nextStates = ArrayList baru<>(); // Isi kendi 1 nextStates.add(new JugState(capacity1, currentState.jug2)); // Isi kendi 2 nextStates.add(new JugState(currentState.jug1, capacity2)); // Kendi kosong 1 nextStates.add(new JugState(0, currentState.jug2)); // Kendi kosong 2 nextStates.add(new JugState(currentState.jug1, 0)); // Tuang dari kendi 1 ke kendi 2 int pourAmount = Math.min(currentState.jug1, capacity2 - currentState.jug2); nextStates.add(JugState baru(currentState.jug1 - pourAmount, currentState.jug2 + pourAmount)); // Tuang dari kendi 2 ke kendi 1 pourAmount = Math.min(currentState.jug2, capacity1 - currentState.jug1); nextStates.add(JugState baru(currentState.jug1 + pourAmount, currentState.jug2 - pourAmount)); kembalikan negara bagian berikutnya; } public static void main(String[] args) { WaterJugSolver solver = new WaterJugSolver(3, 5, 4); Daftar<JugState> solusi = solver.solve(); if (solusi != null) { for (JugState state : solusi) { System.out.println(state); } } else { System.out.println("Tidak ada solusi yang ditemukan."); } } }
DiPemecah Kendi Airkelas, kami menggunakan algoritma pencarian luas - pencarian pertama (BFS) untuk menemukan solusinya. Itumenyelesaikanmetode menginisialisasi antrian untuk menyimpan jalur dan kumpulan untuk melacak status yang dikunjungi. Kita mulai dengan keadaan awal kedua kendi kosong.
ItudapatkanNegara Bagian BerikutnyaMetode ini menghasilkan semua kemungkinan keadaan selanjutnya dari keadaan saat ini dengan melakukan enam operasi yang disebutkan sebelumnya.
Aplikasi Dunia Nyata dan Kendi Air Kami
Masalah kendi air mungkin tampak seperti teka-teki sederhana, namun memiliki penerapan di berbagai bidang seperti pengelolaan dan optimalisasi sumber daya. Dalam konteks bisnis kendi air kami, memahami algoritme ini dapat membantu dalam skenario seperti mengisi wadah air skala besar secara efisien.
Kami menawarkan berbagai macam kendi air untuk memenuhi berbagai kebutuhan. Untuk kegiatan di luar ruangan, kamiKendi Air Luar Ruangan Stainless Steel Kapasitas Besaradalah pilihan yang bagus. Ini dapat menampung banyak air, memastikan Anda tetap terhidrasi selama perjalanan jauh atau berkemah.
Jika Anda memerlukan opsi yang lebih portabel, kamiKendi Portabel Stainless Steel 64ozsempurna. Mudah untuk dibawa kemana-mana, baik saat Anda pergi ke gym atau menjalankan tugas.
Bagi mereka yang membutuhkan lebih banyak penyimpanan air, kamiBotol Air Galon Stainless Steel 64oz 128ozmenyediakan kapasitas yang Anda butuhkan.


Kesimpulan
Menerapkan pemecah masalah kendi air di Java adalah cara yang bagus untuk memahami algoritma seperti BFS dan bagaimana algoritma tersebut dapat diterapkan pada masalah dunia nyata. Sebagai supplier kendi air, kami berkomitmen menyediakan produk berkualitas tinggi yang memenuhi kebutuhan penyimpanan air Anda.
Jika Anda tertarik untuk membeli kendi air kami atau memiliki pertanyaan tentang produk kami, sebaiknya Anda menghubungi diskusi pengadaan. Kami di sini untuk membantu Anda menemukan solusi kendi air yang tepat untuk kebutuhan Anda.
Referensi
- Pengantar Algoritma oleh Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
- Struktur Data dan Algoritma di Java oleh Robert Lafore
