কম্পিউটার টিউটোরিয়াল

C++-এ N-কুইন (N-Queen) সমস্যা সমাধান


এই সমস্যা হলো একটি চেস বোর্ডে Nটি কুইন (queen) úgy সাজানো যাতে কোনো কুইন অন্য কোনো কুইনকে আক্রমণ (attack) না করতে পারে।

চেস কুইন যেকোনো দিকেই আক্রমণ করতে পারে: হরিজেন্টাল (horizontal), ভার্টিক্যাল (vertical), এবং ডায়াগোনাল (diagonal)।

একটি বাইনারি ম্যাট্রিক্স (binary matrix) ব্যবহার করে N কুইনların পজিশন দেখানো হয়, যেখানে কুইনরা একে অপরকে আক্রমণ করতে না পারে। এখানে আমরা ৮ কুইন সমস্যা সমাধান করব।

ইনপুট (Input)

চেস বোর্ডের সাইজ। এখানে ৮ (কারণ ৮x৮ নরমাল চেস বোর্ড)।

আউটপুট (Output)

ম্যাট্রিক্স যা দেখাবে কোন রো (row) এবং কলাম (column)-এ 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

এই আউটপুটে ১ মানটি কুইনların সঠিক পজিশন বোঝায়। ০ মানে চেস বোর্ডের খালি স্পেস।

এলগরিদম

isValid(board, row, col)

Begin
    যদি বাম পাশে কুইন থাকে, তবে return false
    যদি বাম-উপরের ডায়াগোনালে কুইন থাকে, তবে return false
    যদি বাম-নিচের ডায়াগোনালে কুইন থাকে, তবে return false
    return true // অন্যথায় ভ্যালিড প্লেস
End

solveNQueen(board, col)

Begin
    যদি সব কলাম ফিল হয়ে যায়, তবে return true
    বোর্ডের প্রতিটি রো için:
        যদি isValid(board, i, col) true হয়, তবে
            বোর্ডে (i, col) পজিশনে কুইন রাখুন
            যদি solveNQueen(board, col+1) true রিটার্ন করে, তবে return true
            অন্যথায় (i, col) পজিশন থেকে কুইন সরিয়ে দিন (backtrack)
    done
    return false
End

উদাহরণ (৪x৪ বোর্ডের জন্য)

#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; // ভ্যালিড হলে কুইন রাখুন
            if (solveNQueen(board, col + 1)) // রিকার্শন
                return true;
            board[i][col] = 0; // ব্যাকট্র্যাক (backtrack)
        }
    }
    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;
    if (solveNQueen(board, 0) == false) {
        cout << "Solution does not exist";
        return false;
    }
    printBoard(board);
    return true;
}

int main() {
    checkSolution();
}

আউটপুট (৪x৪ বোর্ড)

1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0
  1. C++-এ পার্টিশান সমস্যা: সমান যোগফলের দুটি সাবসেটে বিভাজন

  2. C++ দিয়ে ফ্রেন্ডস পেয়ারিং প্রობ্লেম (Friends Pairing Problem) সমাধান

  3. আংশিকভাবে ভরা সুডোকু গ্রিড সমাধান C++-এ

  4. C#-এ FizzBuzz সমস্যা সমাধান