Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में N-क्वीन समस्या का समाधान


यह समस्या शतरंज बोर्ड पर N क्वीन्स की एक व्यवस्था खोजने की है, जैसे कि कोई क्वीन बोर्ड पर किसी अन्य क्वीन पर हमला न कर सके।

शतरंज की क्वीन्स किसी भी दिशा में हमला कर सकती हैं - क्षैतिज, लंबवत और विकर्ण तरीके से।

N क्वीन्स की स्थितियों को दर्शाने के लिए एक बाइनरी मैट्रिक्स का उपयोग किया जाता है, जहां कोई क्वीन दूसरी क्वीन्स पर हमला नहीं कर सकती। यहां, हम 8 क्वीन्स की समस्या हल करते हैं।

इनपुट

शतरंज बोर्ड का आकार। यह यहां 8 है क्योंकि (8x8 सामान्य शतरंज बोर्ड का आकार है)।

आउटपुट

वह मैट्रिक्स जो दर्शाता है कि N क्वीन्स को किस पंक्ति और कॉलम में रखा जा सकता है।

यदि समाधान मौजूद नहीं है, तो यह false लौटाएगा।

1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0

इस आउटपुट में, मान 1 क्वीन्स के लिए सही स्थान को दर्शाता है। 0 शतरंज बोर्ड पर खाली स्थानों को दर्शाता है।

एल्गोरिदम

isValid(board, row, col)

Begin
    यदि वर्तमान कॉलम के बाईं ओर कोई क्वीन है, तो
        return false
    यदि बाएं ऊपरी विकर्ण पर कोई क्वीन है, तो
        return false
    यदि बाएं निचले विकर्ण पर कोई क्वीन है, तो
        return false
    return true // अन्यथा यह वैध स्थान है
End

solveNQueen(board, col)

Begin
    यदि सभी कॉलम भर गए हैं, तो
        return true
    बोर्ड की प्रत्येक पंक्ति के लिए, करें
        यदि isValid(board, i, col), तो
            बोर्ड में स्थान (i, col) पर क्वीन सेट करें
            यदि solveNQueen(board, col+1) = true, तो
                return true
            अन्यथा बोर्ड से स्थान (i, col) से क्वीन हटाएं।
        done
    return false
End

उदाहरण

#include <iostream>
using namespace std;

#define N 4

void printBoard(int board[N][N]) {
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++)
            cout << board[i][j] << " ";
        cout << endl;
    }
}

bool isValid(int board[N][N], int row, int col) {
    for(int i = 0; i < col; i++) // जांचें कि बाईं ओर क्वीन है या नहीं
        if(board[row][i])
            return false;
    
    for(int i = row, j = col; i >= 0 && j >= 0; i--, j--)
        if(board[i][j]) // जांचें कि बाएं ऊपरी विकर्ण पर क्वीन है या नहीं
            return false;
    
    for(int i = row, j = col; j >= 0 && i < N; i++, j--)
        if(board[i][j]) // जांचें कि बाएं निचले विकर्ण पर क्वीन है या नहीं
            return false;
    
    return true;
}

bool solveNQueen(int board[N][N], int col) {
    if(col >= N) // जब N क्वीन्स सफलतापूर्वक रखी गईं
        return true;
    
    for(int i = 0; i < N; i++) { // प्रत्येक पंक्ति के लिए, जांचें कि क्वीन रखना संभव है या नहीं
        if(isValid(board, i, col)) {
            board[i][col] = 1; // यदि मान्य है, तो स्थान (i, col) पर क्वीन रखें
            if(solveNQueen(board, col + 1)) // अन्य कॉलम्स के लिए रिकर्सिवली जाएं
                return true;
            board[i][col] = 0; // जब कोई स्थान खाली नहीं है तो उस क्वीन को हटाएं
        }
    }
    return false; // जब कोई संभावित क्रम नहीं मिलता
}

bool checkSolution() {
    int board[N][N];
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            board[i][j] = 0; // सभी एलिमेंट्स को 0 पर सेट करें
    
    if(solveNQueen(board, 0) == false) { // 0वें कॉलम से शुरू
        cout << "Solution does not exist";
        return false;
    }
    printBoard(board);
    return true;
}

int main() {
    checkSolution();
    return 0;
}

आउटपुट

1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0

N-क्वीन समस्या एक क्लासिक बैकट्रैकिंग समस्या है। N=4 के लिए, दो समाधान मौजूद हैं। N=8 के लिए, 92 विशिष्ट समाधान हैं। एल्गोरिदम कॉलम दर कॉलम क्वीन्स रखता है, पंक्तियों और विकर्णों में संघर्षों की जांच करता है। समय जटिलता O(N!) है लेकिन प्रूनिंग के साथ व्यवहार में बहुत तेज है।

  1. - C++ में पार्टीशन समस्या

    इस समस्या में, हमें C++ कोड बनाना होगा यह निर्धारित करने के लिए कि क्या एक सरणी को दो समान उपसरणियों में विभाजित किया जा सकता है। साथ ही, हमें यह जांचना होगा कि क्या दोनों उपसरणियों में सभी तत्वों का योग बिल्कुल समान है या नहीं। पार्टीशन समस्या सबसेट सम समस्या का एक प्रकार है, जो बदले में नैपसैक सम

  1. - C++ में फ्रेंड्स पेयरिंग समस्या

    समस्या विवरण इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया गया है जो एक समूह में दोस्तों की संख्या को दर्शाता है। हमारा कार्य फ्रेंड्स पेयरिंग समस्या को हल करने के लिए एक प्रोग्राम बनाना है। समूह का प्रत्येक दोस्त या तो अकेला रह सकता है या किसी अन्य दोस्त के साथ जोड़ी बना सकता है। समूह के प्रत्येक

  1. आंशिक रूप से भरे सुडोकू ग्रिड को हल करने का प्रोग्राम C++ में आंशिक रूप से भरे सुडोकू ग्रिड को हल करने का प्रोग्राम C++ में

    मान लीजिए हमारे पास एक आंशिक रूप से भरा सुडोकू ग्रिड है और हमें इसे हल करना है। हम जानते हैं कि सुडोकू एक 9 × 9 संख्या ग्रिड है, और पूरा ग्रिड 3 × 3 बॉक्स में भी विभाजित है। सुडोकू हल करने के कुछ नियम हैं। हमें इस समस्या को हल करने के लिए 1 से 9 तक के अंकों का उपयोग करना है। एक अंक को एक पंक्ति, एक