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

C++ প্রোগ্রাম: দুটি স্ট্যাক খালি করা সম্ভব কিনা যাচাই


মান লিজিয়ে, 2n টি চিঠি আছে এবং প্রতিটি চিঠিতে ১ থেকে n পর্যন্ত একটি পূর্ণসংখ্যা লেখা আছে। প্রতিটি সংখ্যার জন্য ঠিক দুটি চিঠি আছে। এই চিঠিগুলো m টি স্টকে সাজানো আছে এবং i-তম স্টকে stacks[i] চিঠি আছে। আমাদের কাজ হলো সব স্টকে নিচের পদ্ধতিতে খালি করা:

  • যেকোনো দুটি স্টক বেছে নিতে হবে এবং উভয় স্টকের উপরের চিঠি সরিয়ে ফেলতে হবে।

  • সরানো চিঠ দুটির উপরে একই সংখ্যা থাকতে হবে।

যদি আমরা এই পদ্ধতিতে m টি স্টক খালি করতে পারি, তবে true প্রিন্ট করব, অন্যথায় false রিটার্ন করব।

যেমন, ইনপুট হলে n = 3, m = 2, stacks = {{2, 1, 3}, {2, 1, 3}}, তবে আউটপুট হবে true।

দুটি স্টক আছে এবং প্রতিটি স্টকে চিঠিগুলোতে ২, ১, ৩ নম্বর লেখা আছে। তাই আমরা দুটি স্টক থেকে চিঠি সরিয়ে সেগুলো খালি করতে পারি।

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

এই সমস্যাটি সমাধান করার জন্য নিচের ধাপগুলো অনুসরণ করব:

dp ২D অ্যারে সংজ্ঞায়িত করুন tvec অ্যারে সংজ্ঞায়িত করুন i := 0 থেকে m-1 পর্যন্ত: k := stacks[i]-র আকার j := 0 থেকে k-1 পর্যন্ত: if j < 0, তবে: dp[stacks[i, j]]-র শেষে p যোগ করুন tvec[p] ১ বাড়িয়ে p := stacks[i, j] tp অ্যারে সংজ্ঞায়িত করুন i := 1 থেকে n পর্যন্ত: একটি q কিউ সংজ্ঞায়িত করুন q-তে i যোগ করুন while (q খালি নয়): if not tp[q-র প্রথম উপাদান] এবং tvec[q-র প্রথম উপাদান] == 0, তবে: dp[q-র প্রথম উপাদান]-র প্রতিটি next উপাদানের জন্য: tvec[next] ১ কমিয়ে q-তে next যোগ করুন tp[q-র প্রথম উপাদান] := true q-র প্রথম উপাদান মুছুন i := 1 থেকে n পর্যন্ত: if tvec[i] != 0, তবে: return false return true

উদাহরণ

নিচের ইমপ্লিমেন্টেশনটি দেখুন আরও ভালো বুঝতে:

#include <bits/stdc++.h> using namespace std; bool solve(int n, int m, vector<vector<int>> stacks){    vector<vector<int>> dp(n + 1);    vector<int> tvec(n + 1);    for(int i = 0; i < m; i++){       int k = stacks[i].size();       int p;       for(int j = 0; j < k; j++){          if(j > 0){             dp[stacks[i][j]].push_back(p);             tvec[p]++;           }          p = stacks[i][j];       }    }    vector<bool> tp(n + 1);    for(int i = 1; i <= n; i++){       queue<int> q;       q.push(i);       while(!q.empty()){          if(!tp[q.front()] && tvec[q.front()] == 0){             for(auto next: dp[q.front()]){                tvec[next]--; q.push(next);             }             tp[q.front()]=true;          }          q.pop();       }    }    for(int i = 1; i <= n; i++){       if(tvec[i] != 0){          return false;       }    }    return true; } int main() {    int n = 3, m = 2;    vector<vector<int>> stacks = {{2, 1, 3}, {2, 1, 3}};    cout<< solve(n, m, stacks);    return 0; }

ইনপুট

3, 2, {{2, 1, 3}, {2, 1, 3}}

আউটপুট

1

  1. সি++ STL ব্যবহার করে অ্যারে প্যালিনড্রোম কিনা তা যাচাই করার প্রোগ্রাম

  2. প্যালিনড্রোম (Palindrome) নম্বর চেক করার C++ প্রোগ্রাম

  3. C++ প্রোগ্রাম: প্রাইম সংখ্যা (Prime Number) যাচাই

  4. পাইথনে ক্যারেক্টার স্ব্যাপ করে দুটি স্ট্রিং সমান করা সম্ভব কিনা চেক করা