باعتباري موردًا لأباريق الماء، كنت دائمًا مفتونًا بالجوانب العملية والنظرية لأباريق الماء. إحدى المشاكل النظرية المثيرة للاهتمام والتي لها آثار في العالم الحقيقي هي مشكلة إبريق الماء. في هذه المدونة، سأرشدك خلال تنفيذ حل مشكلة إبريق الماء في Java.
فهم مشكلة إبريق الماء
مشكلة إبريق الماء هي لغز كلاسيكي. لقد تم إعطاؤك إبريقين بسعة (x) و(y) لتر، وهدف قياس (z) لتر من الماء. العمليات التي يمكنك تنفيذها هي:
- املأ إبريقًا بالكامل.
- إبريق فارغ.
- صب الماء من إبريق إلى آخر حتى يصبح إبريق المصدر فارغًا أو يمتلئ إبريق الوجهة.
الهدف هو العثور على سلسلة من هذه العمليات التي ستؤدي إلى وجود (ض) لتر من الماء في أحد الأباريق.
تنفيذ جافا لحل مشكلة إبريق الماء
لنبدأ بإنشاء فصل لتمثيل حالة الأباريق.
فئة JugState { int jug1؛ إبريق كثافة العمليات2؛ public JugState(int jug1, int jug2) { this.jug1 = jug1; this.jug2 = jug2; } @Override public boolean يساوي(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; } }
هذاJugStateيمثل الفصل الكمية الحالية من الماء في كل إبريق. نحن نتجاوزيساويوhashCodeطرق لتكون قادرة على استخدام هذه الحالات في هياكل البيانات مثلHashSet.
بعد ذلك، سنقوم بتنفيذ فئة الحل الرئيسي.
import java.util.*; فئة عامة WaterJugSolver {خاصة سعة 1؛ القدرة الخاصة 2 ؛ الهدف الخاص كثافة العمليات؛ public WaterJugSolver(int سعة 1, سعة int2, كثافة العمليات الهدف) { this.capacity1 = قدرة 1; this.capacity2 = القدرات2; this.target = target; } public List<JugState>solve() { Queue<List<JugState>> queue = new LinkedList<>(); Set<JugState> تمت زيارته = new HashSet<>(); JugState originalState = new JugState(0, 0); List<JugState> originalPath = 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(JugStatecurrentState) { List<JugState> nextStates = new ArrayList<>(); // املأ الإبريق 1 nextStates.add(new JugState(capacity1,currentState.jug2)); // املأ الإبريق 2 nextStates.add(new JugState(currentState.jug1,سعة2)); // إبريق فارغ 1 nextStates.add(new JugState(0,currentState.jug2)); // إبريق فارغ 2 nextStates.add(new JugState(currentState.jug1, 0)); // صب من الإبريق 1 إلى الإبريق 2 int pourAmount = Math.min(currentState.jug1,سعة2 -currentState.jug2); nextStates.add(new JugState(currentState.jug1 - pourAmount,currentState.jug2 + pourAmount)); // اسكب من الإبريق 2 إلى الإبريق 1 pourAmount = Math.min(currentState.jug2,capacity1 -currentState.jug1); nextStates.add(new JugState(currentState.jug1 + pourAmount,currentState.jug2 - pourAmount)); إرجاع الدول التالية؛ } public static void main(String[] args) { WaterJugSolversolver = new WaterJugSolver(3, 5, 4); List<JugState> Solution =solver.solve(); if (solution != null) { for (JugStatestate :solution) { System.out.println(state); } } else { System.out.println("لم يتم العثور على حل."); } } }
فيWaterJugSolverفئة، نستخدم خوارزمية البحث الأول (BFS) للعثور على الحل. اليحليقوم الأسلوب بتهيئة قائمة انتظار لتخزين المسارات ومجموعة لتتبع الحالات التي تمت زيارتها. نبدأ بالحالة الأولية لكلا الدورتين الفارغتين.
الgetNextStatesتولد الطريقة جميع الحالات التالية المحتملة من الحالة الحالية عن طريق إجراء العمليات الست المذكورة سابقًا.
تطبيقات حقيقية في العالم وأباريق الماء الخاصة بنا
قد تبدو مشكلة إبريق الماء بمثابة لغز بسيط، ولكن لها تطبيقات في مجالات مثل إدارة الموارد وتحسينها. في سياق أعمالنا المتعلقة بأباريق المياه، يمكن أن يساعد فهم هذه الخوارزميات في سيناريوهات مثل ملء حاويات المياه كبيرة الحجم بكفاءة.
نحن نقدم مجموعة واسعة من أباريق المياه لتلبية الاحتياجات المختلفة. للأنشطة الخارجية، لديناإبريق ماء خارجي من الفولاذ المقاوم للصدأ بسعة كبيرةهو خيار عظيم. يمكنه حمل كمية كبيرة من الماء، مما يضمن لك البقاء رطبًا أثناء المشي لمسافات طويلة أو رحلات التخييم.
إذا كنت بحاجة إلى خيار محمول أكثر، فلديناإبريق محمول من الفولاذ المقاوم للصدأ سعة 64 أونصةمثالي. من السهل حملها، سواء كنت ستذهب إلى صالة الألعاب الرياضية أو تقوم بمهام.
بالنسبة لأولئك الذين يحتاجون إلى المزيد من تخزين المياه، لدينازجاجة مياه من الفولاذ المقاوم للصدأ سعة 64 أونصة وسعة 128 أونصة جالونيوفر القدرة التي تحتاجها.


خاتمة
يعد تنفيذ حل مشكلات إبريق الماء في Java طريقة رائعة لفهم خوارزميات مثل BFS وكيف يمكن تطبيقها على مشكلات العالم الحقيقي. باعتبارنا موردًا لأباريق المياه، فإننا ملتزمون بتوفير منتجات عالية الجودة تلبي احتياجات تخزين المياه الخاصة بك.
إذا كنت مهتمًا بشراء أباريق المياه الخاصة بنا أو كانت لديك أي أسئلة حول منتجاتنا، فنحن نشجعك على التواصل معنا لإجراء مناقشة حول الشراء. نحن هنا لمساعدتك في العثور على الحل الأمثل لإبريق الماء الذي يلبي متطلباتك.
مراجع
- مقدمة للخوارزميات بقلم توماس إتش. كورمين، تشارلز إي. ليسرسون، رونالد إل. ريفست، كليفورد ستاين
- هياكل البيانات والخوارزميات في جافا بقلم روبرت لافور
