आठ रानियों की समस्या शतरंज की बिसात पर प्रत्येक पंक्ति में एक रानी को रखने का समाधान ढूंढना है ताकि कोई भी दो रानियां एक-दूसरे पर हमला न कर सकें। समस्या को रिकर्सन का उपयोग करके हल किया जा सकता है। इस अनुभाग में, हम इस समस्या को हल करने के लिए बैकट्रैकिंग नामक एक सामान्य एल्गोरिदम डिज़ाइन तकनीक पेश करेंगे। बैकट्रैकिंग दृष्टिकोण क्रमिक रूप से एक उम्मीदवार समाधान की खोज करता है, जैसे ही यह निर्धारित होता है कि उस विकल्प को छोड़ देता है
उम्मीदवार संभवतः एक वैध समाधान नहीं हो सकता है, और फिर एक नए उम्मीदवार की तलाश करता है।
आप शतरंज की बिसात को दर्शाने के लिए द्वि-आयामी सरणी का उपयोग कर सकते हैं। हालाँकि, चूँकि प्रत्येक पंक्ति में केवल एक रानी हो सकती है, पंक्ति में रानी की स्थिति को दर्शाने के लिए एक-आयामी सरणी का उपयोग करना पर्याप्त है। इस प्रकार, आप क्वीन सरणी को इस प्रकार परिभाषित कर सकते हैं:
int[] क्वीन्स = नया int[8];
j को queens[i] को यह दर्शाने के लिए असाइन करें कि एक रानी को पंक्ति i और कॉलम j में रखा गया है। नीचे दिया गया चित्र (ए) नीचे दिए गए चित्र (बी) में शतरंज की बिसात के लिए क्वीन सरणी की सामग्री दिखाता है।
खोज पहली पंक्ति से k = 0 के साथ शुरू होती है, जहां k वर्तमान पंक्ति का सूचकांक माना जा रहा है। एल्गोरिदम जाँचता है कि क्या इस क्रम में _j = 0, 1, ..., 7 के लिए पंक्ति में j_वें कॉलम में एक रानी को संभवतः रखा जा सकता है। खोज इस प्रकार कार्यान्वित की गई है:
नीचे दिया गया कोड वह प्रोग्राम देता है जो आठ क्वींस समस्या का समाधान प्रदर्शित करता है।
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