কম্পিউটার

C++ এ ডাইস রোল সিমুলেশন


ধরুন একটি ডাই সিমুলেটর প্রতিটি রোলের জন্য 1 থেকে 6 পর্যন্ত একটি এলোমেলো সংখ্যা তৈরি করে। আমরা জেনারেটরে একটি সীমাবদ্ধতা প্রবর্তন করতে চাই যাতে এটি ধারাবাহিক বার rollMax[i] (1-সূচীকৃত) এর চেয়ে বেশি নম্বর রোল করতে পারে না। বিবেচনা করুন আমাদের কাছে পূর্ণসংখ্যার একটি অ্যারে রয়েছে rollMax এবং একটি পূর্ণসংখ্যা n, আমাদের নির্দিষ্ট ক্রমগুলির সংখ্যা ফেরত দিতে হবে যা সঠিক n রোলগুলির সাথে পাওয়া যেতে পারে। অন্তত একটি উপাদান একে অপরের থেকে পৃথক হলে দুটি ক্রম ভিন্ন বলে বিবেচিত হয়। সুতরাং n যদি 2 হয়, তাহলে rollMax =[1,1,2,2,2,3], তাহলে আউটপুট হবে 34। তাই ডাই-এ 2টি রোল থাকবে, যদি কোনো বাধা না থাকে, ডাই-এ আছে 6*6 =36 সম্ভাব্য সংমিশ্রণ, এই ক্ষেত্রে সংখ্যা 1 এবং 2 সর্বাধিক একবার পরপর প্রদর্শিত হয়, তাই ক্রম (1,1) এবং (2,2) ঘটতে পারে না। তাই চূড়ান্ত উত্তর হবে 36 – 2 =34।

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

  • dfs() নামে একটি পদ্ধতি তৈরি করুন, এটি dieLeft, last, currLen, array r এবং matrix dp লাগবে
  • যদি dieLeft =0, তাহলে 1 ফেরত দিন
  • যদি dp[dieLeft][last][currLen] -1 না হয়, তাহলে dp[dieLeft, last, currLen] ফেরত দিন।
  • কাউন্টার :=0
  • আমি 0 থেকে 6 রেঞ্জের জন্য
    • যদি i =শেষ এবং r[i] =currLen, তাহলে পরবর্তী অংশটি এড়িয়ে যান এবং পরবর্তী পুনরাবৃত্তির জন্য যান
    • counter :=dfs(dieLeft – 1, i, currLen + 1 when i =last, অন্যথায় 1, r, dp)
  • dp[dieLeft, last, currLen] :=কাউন্টার
  • রিটার্ন dp[dieLeft, last, currLeft]
  • প্রধান পদ্ধতি হবে −
  • এর মত
  • ডিপি অফ অর্ডার (n + 1) x 6 x 16 নামে একটি 3D অ্যারে তৈরি করুন এবং এটি -1 দিয়ে পূরণ করুন
  • রিটার্ন dfs(n, 0, 0, rollMax, dp)

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
class Solution {
   public:
   int dfs(int dieLeft, int last, int currLen, vector <int> &r,vector < vector < vector <int> > > &dp){
      if(dieLeft == 0){
         return 1;
      }
      if(dp[dieLeft][last][currLen]!=-1)return dp[dieLeft][last][currLen];
      int counter = 0;
      for(int i =0;i<6;i++){
         if(i==last && r[i] == currLen)continue;
         counter = (counter%mod + (dfs(dieLeft-1,i,i==last?currLen+1:1,r,dp))%mod)%mod;
      }
      dp[dieLeft][last][currLen] = counter%mod;
      return dp[dieLeft][last][currLen]%mod;
   }
   int dieSimulator(int n, vector<int>& rollMax) {
      vector < vector < vector <int> > > dp(n+1, vector < vector <int> > (6, vector <int>(16, -1)));
      return dfs(n,0,0,rollMax, dp)%mod;
   }
};
main(){
   vector<int> v = {1,1,2,2,2,3};
   Solution ob;
   cout << (ob.dieSimulator(2,v));
}

ইনপুট

2
[1,1,2,2,2,3]

আউটপুট

34

  1. C++ এ রেখার প্রতিফলন

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

  3. C++ এ কিল প্রসেস

  4. C++ এ কাঠবিড়ালি সিমুলেশন