ধরুন, 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