ধরুন আমাদের একটি বাইনারি ম্যাট্রিক্স আছে যেখানে সারির n_rows সংখ্যা এবং কলামের n_cols সংখ্যা রয়েছে। এখানে সমস্ত মান প্রাথমিকভাবে 0। আমাদের একটি ফাংশন flip() সংজ্ঞায়িত করতে হবে যা এলোমেলোভাবে একটি 0 মান পছন্দ করে, এটি 1 এ পরিবর্তন করে এবং তারপর সেই মানের অবস্থান [row.id, col.id] প্রদান করে। এছাড়াও, আমাদের অন্য একটি ফাংশন রিসেট() লিখতে হবে যা সমস্ত মান 0-এ সেট করে। আমাদের সিস্টেমের Math.random()-এ কলের সংখ্যা কমিয়ে আনার চেষ্টা করতে হবে এবং সময় ও স্থান জটিলতা অপ্টিমাইজ করতে হবে।
যদি আমাদের ক্রম 2x3 এর ম্যাট্রিক্স থাকে এবং আমরা চারবার ফ্লিপ বলি, তাহলে ফলাফল হবে [0,1], [1,2], [1,0], [1,1]।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- গর্ত নামে একটি মানচিত্র তৈরি করুন,
- ইনিশিয়ালাইজারে, নিম্নলিখিতগুলি করুন
- র্যান্ডম নম্বর জেনারেটর শুরু করুন, n :=সারি সংখ্যা, m :=কলের সংখ্যা,
- আকার :=n * m
- ফ্লিপ পদ্ধতিতে, নিম্নলিখিতগুলি করুন -
- id :=র্যান্ডম সংখ্যা মোড সাইজ, সাইজ 1 কমিয়ে দিন, rid :=id
- যদি id ছিদ্রে থাকে, তাহলে id :=holes[id]
- গর্ত[রিড] :=গর্ত [আকার] যখন গর্তের আকার অন্যথায় আকারে
- একটি জোড়া ফেরত দিন (id / m, id mod m)
- রিসেট পদ্ধতিতে, করুন
- আকার :=n x m, এবং গর্তগুলি পরিষ্কার করুন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#includeনেমস্পেস ব্যবহার করে std;void print_vector(vector v){ cout <<"["; for(int i =0; i holes; int n; int m; int আকার; সমাধান(int n_rows, int n_cols) { srand(time(NULL)); n =n_সারি; m =n_cols; আকার =n * m; } ভেক্টর flip() { int id =rand() % সাইজ; আকার--; int rid =id; if(holes.count(id)){ id =holes[id]; } holes[rid] =holes.count(size)? গর্ত [আকার] :আকার; রিটার্ন {id / m, id % m}; } void reset() { size =n * m; holes.clear(); }};প্রধান(){সমাধান ob(2,2); print_vector(ob.flip()); print_vector(ob.flip()); print_vector(ob.flip()); print_vector(ob.flip());}
ইনপুট
2,2 ব্যবহার করে কনস্ট্রাক্টর শুরু করুন এবং চারবার ফ্লিপ কল করুন