مشكلة الملكات الثماني هي إيجاد حل لوضع ملكة في كل صف على رقعة الشطرنج بحيث لا تستطيع ملكتان مهاجمة بعضهما البعض. يمكن حل المشكلة باستخدام العودية. في هذا القسم، سنقدم تقنية تصميم خوارزمية شائعة تسمى التتبع لحل هذه المشكلة. يبحث نهج التراجع عن حل مرشح بشكل تدريجي، ويتخلى عن هذا الخيار بمجرد تحديد أن
لا يمكن أن يكون المرشح حلاً صالحًا، ثم يبحث عن مرشح جديد.
يمكنك استخدام مصفوفة ثنائية الأبعاد لتمثيل رقعة الشطرنج. ومع ذلك، بما أن كل صف يمكن أن يحتوي على ملكة واحدة فقط، فإنه يكفي استخدام مصفوفة أحادية البعد للإشارة إلى موضع الملكة في الصف. وبالتالي، يمكنك تعريف المصفوفة الملكات على النحو التالي:
int[] الملكات = int الجديد[8];
قم بتعيين j إلى الملكات[i] للإشارة إلى وضع الملكة في الصف i والعمود j. الشكل أدناه (أ) يوضح محتويات مصفوفة الملكات لرقعة الشطرنج في الشكل أدناه (ب).
يبدأ البحث من الصف الأول بـ k = 0، حيث k هو فهرس الصف الحالي قيد النظر. تتحقق الخوارزمية مما إذا كان من الممكن وضع الملكة في العمود j_th في الصف لـ _j = 0, 1, ... , 7 بهذا الترتيب. ويتم البحث على النحو التالي:
الكود أدناه يعطي البرنامج الذي يعرض حل لمشكلة الملكات الثمانية.
package application; import javafx.application.Application; import javafx.geometry.Pos; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.GridPane; public class EightQueens extends Application { public static final int SIZE = 8; // The size of the chess board // queens are placed at (i, queens[i]) // -1 indicates that no queen is currently placed in the ith row // Initially, place a queen at (0, 0) in the 0th row private int[] queens = {-1, -1, -1, -1, -1, -1, -1, -1}; @Override // Override the start method in the Application class public void start(Stage primaryStage) { search(); // Search for a solution // Display chess board GridPane chessBoard = new GridPane(); chessBoard.setAlignment(Pos.CENTER); Label[][] labels = new Label[SIZE][SIZE]; for(int i = 0; i = 0 && kيستدعي البرنامج search() (السطر 20) للبحث عن حل. في البداية، لا يتم وضع الملكات في أي صفوف (السطر 16). يبدأ البحث الآن من الصف الأول بـ k = 0 (السطر 53) ويجد مكانًا للملكة (السطر 56). إذا نجحت، ضعه في الصف (السطر 61) وفكر في الصف التالي (السطر 62). إذا لم تنجح، قم بالرجوع إلى الصف السابق (السطور 58-59).
تبحث طريقة findPosition(k) عن موضع محتمل لوضع الملكة في الصف k بدءًا من queen[k] 1 (السطر 73) . إنه يتحقق مما إذا كان يمكن وضع الملكة في start، start 1، . . . و 7 بهذا الترتيب (السطور 75-78). إذا أمكن، قم بإرجاع فهرس العمود (السطر 77)؛ بخلاف ذلك، قم بإرجاع -1 (السطر 80).
يتم استدعاء الطريقةisValid(row, column) للتحقق مما إذا كان وضع الملكة في الموضع المحدد يسبب تعارضًا مع الملكات الموضوعة مسبقًا (السطر 76). ويضمن عدم وضع أي ملكة في نفس العمود (السطر 86)، في القطر العلوي الأيسر (السطر 87)، أو في القطر العلوي الأيمن (السطر 88)، كما هو موضح في الشكل أدناه.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3