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

C++-এ স্লাইডিং পাজল (Sliding Puzzle) সমাধান

ধরুন আমাদের একটি ২x৩ বোর্ড আছে যেখানে ১ থেকে ৫ নম্বরের ৫টি টাইল এবং একটি খালি স্থান (০ দিർഘ উপস্থাপিত) রয়েছে। একটি মুভ বলতে ০ এবং তার সন্নিহিত কোনো সংখ্যা (উপর, নিচ, বাম, ডান) এর মধ্যে সোয়াপ বোঝায়। পাজলটি সমাধান হয়ে যাবে যখন বোর্ডটি [[1,2,3],[4,5,0]] এই অবস্থানে আসবে।

আমাদের দেওয়া বোর্ড থেকে সমাধান অবস্থায় যেতে কমপক্ষে কতটি মুভ দরকার তা বের করতে হবে। অসম্ভব হলে -১ রিটার্ন করুন।

উদাহরণ

ইনপুট: [[1,2,3],[0,4,5]] → আউটপুট: 2

ব্যাখ্যা: প্রথমে [0,4] সোয়াপ, তারপর [0,5] সোয়াপ।

সমাধানের ধাপসমূহ

  1. BFS (Breadth-First Search) ব্যবহার করুন কারণ এটি সবচেয়ে ছোট পাথ বের করে।
  2. প্রতিটি স্টেটকে একটি নোড হিসেবে বিবেচনা করুন।
  3. ভিজিটেড স্টেটগুলো সেটে রাখুন যাতে পুনরাবৃত্তি 나 না।
  4. লেভেল বাই লেভেল এক্সপ্লোর করুন যতক্ষণ না সমাধান পাওয়া যায়।

প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;

int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

class Solution {
public:
    bool ok(vector<vector<int>>& b) {
        return b[0][0] == 1 && b[0][1] == 2 && b[0][2] == 3 && 
               b[1][0] == 4 && b[1][1] == 5;
    }
    
    int slidingPuzzle(vector<vector<int>>& board) {
        if (ok(board)) return 0;
        
        queue<vector<vector<int>>> q;
        q.push(board);
        set<vector<vector<int>>> visited;
        visited.insert(board);
        
        for (int lvl = 1; !q.empty(); lvl++) {
            int sz = q.size();
            while (sz--) {
                auto node = q.front();
                q.pop();
                
                int x = -1, y = -1;
                for (int i = 0; i < board.size(); i++) {
                    for (int j = 0; j < board[0].size(); j++) {
                        if (node[i][j] == 0) {
                            x = i; y = j;
                            break;
                        }
                    }
                }
                
                for (int k = 0; k < 4; k++) {
                    int nx = x + dir[k][0];
                    int ny = y + dir[k][1];
                    if (nx < 0 || ny < 0 || nx >= board.size() || ny >= board[0].size())
                        continue;
                    
                    swap(node[x][y], node[nx][ny]);
                    if (visited.count(node)) {
                        swap(node[x][y], node[nx][ny]);
                        continue;
                    }
                    visited.insert(node);
                    if (ok(node)) return lvl;
                    q.push(node);
                    swap(node[x][y], node[nx][ny]);
                }
            }
        }
        return -1;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{1,2,3},{0,4,5}};
    cout << (ob.slidingPuzzle(v));
}

ইনপুট

{{1,2,3},{0,4,5}}

আউটপুট

2
  1. C++-এ Line Reflection: ২D প্লেনে বিন্দুগুলোর Y-অক্ষ সমান্তরাল প্রতিফলন লাইন আছে কিনা যাচাই করা

  2. C++-এ ডায়াগোনাল ট্রায়ভার্স II

  3. প্রসেস কিল করা (Kill Process) C++-এ

  4. স্কোয়ারেল সিমুলেশন (Squirrel Simulation) C++-এ