কম্পিউটার

দুটি স্তুপ অক্ষর খালি করা যায় কিনা তা পরীক্ষা করার জন্য C++ প্রোগ্রাম


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

  • আমাদের যেকোনো দুটি স্ট্যাক বেছে নিতে হবে এবং তাদের উভয় থেকে উপরের অক্ষরটি সরিয়ে ফেলতে হবে।

  • আমরা যে অক্ষরগুলি সরিয়ে দিয়েছি সেগুলির উভয়েরই একই নম্বর থাকতে হবে৷

যদি আমরা এইভাবে m স্ট্যাকগুলি খালি করতে পারি, তাহলে আমরা সত্য প্রিন্ট করব বা অন্যথায় আমরা মিথ্যা ফেরত দেব।

সুতরাং, যদি ইনপুটটি n =3, m =2, stacks ={{2, 1, 3}, {2, 1, 3}} এর মত হয়, তাহলে আউটপুট সত্য হবে।

দুটি স্ট্যাক রয়েছে এবং প্রতিটি স্ট্যাকের অক্ষর রয়েছে যেগুলির উপর যথাক্রমে 2, 1, 3 লেখা রয়েছে। সুতরাং, আমরা দুটি স্ট্যাক থেকে সরাতে পারি এবং প্রদত্ত পদ্ধতিতে খালি করতে পারি।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

Define one 2D array dp
Define an array tvec
for initialize i := 0, when i < m, update (increase i by 1), do:
   k := size of stacks[i]
   for initialize j := 0, when j < k, update (increase j by 1), do:
      if j < 0, then:
         insert p at the end of dp[stacks[i, j]]
         (increase tvec[p] by 1)
      p := stacks[i, j]
Define an array tp
for initialize i := 1, when i <= n, update (increase i by 1), do:
   Define one queue q
   insert i into q
   while (q is not empty), do:
    if not tp[first element of q] and tvec[first element of q] is same as 0, then:
         for each element next in dp[first element of q], do:
             (decrease tvec[next] by 1)
             insert next into q
         tp[first element of q] := true
   delete first element from q
for initialize i := 1, when i <= n, update (increase i by 1), do:
   if tvec[i] is not equal to 0, then:
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. একটি অ্যারে প্যালিনড্রোম কিনা বা C++ এ STL ব্যবহার করছে না তা পরীক্ষা করার জন্য প্রোগ্রাম

  2. একটি নম্বর প্যালিনড্রোম কিনা তা পরীক্ষা করার জন্য C++ প্রোগ্রাম

  3. একটি নম্বর প্রাইম কি না তা পরীক্ষা করার জন্য C++ প্রোগ্রাম

  4. দুটি স্ট্রিং চেক করার প্রোগ্রাম অক্ষর অদলবদল করে সমান হতে পারে বা পাইথনে নয়