"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > حل مشكلة الملكات الثمانية باستخدام طريقة التراجع

حل مشكلة الملكات الثمانية باستخدام طريقة التراجع

تم النشر بتاريخ 2024-11-02
تصفح:349

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

يمكنك استخدام مصفوفة ثنائية الأبعاد لتمثيل رقعة الشطرنج. ومع ذلك، بما أن كل صف يمكن أن يحتوي على ملكة واحدة فقط، فإنه يكفي استخدام مصفوفة أحادية البعد للإشارة إلى موضع الملكة في الصف. وبالتالي، يمكنك تعريف المصفوفة الملكات على النحو التالي:

int[] الملكات = int الجديد[8];

قم بتعيين j إلى الملكات[i] للإشارة إلى وضع الملكة في الصف i والعمود j. الشكل أدناه (أ) يوضح محتويات مصفوفة الملكات لرقعة الشطرنج في الشكل أدناه (ب).

Image description

يبدأ البحث من الصف الأول بـ 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)، كما هو موضح في الشكل أدناه.

Image description

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/paulike/solve-the-eight-queens-problem-using-backtracking-25cc?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3