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

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


একটি ডাইস সিমুলেটর ১ থেকে ৬ পর্যন্ত র‍্যান্ডম নম্বর দেয়। প্রতিটি ফেস i সর্বোচ্চ rollMax[i] বার লায়োমিয়েটে আসতে পারে। n রোলের আলাদা সিকোয়েন্সের সংখ্যা বের করতে হবে (মড ১০⁹+৭)।

উদাহরণ: n=2, rollMax=[1,1,2,2,2,3] → ৩৬ - ২ = ৩৪ (কারণ ১,১ এবং ২,২ বর্জিত)।

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

  • মেমোরাইজেশন সহ DFS: dfs(dieLeft, lastFace, currLen)।
  • বেস কেস: dieLeft == 0 → ১ রিটার্ন।
  • নেক্সট ফেস ০-৫ ট্রাই করুন। যদি i == lastFace && currLen == rollMax[i] হয়, স্কিপ করুন।
  • নতুন currLen = (i==lastFace) ? currLen+1 : 1।
  • ৩D DP dp[dieLeft][lastFace][currLen] দিয়ে ক্যাশ করুন।

C++ উদাহরণ

#include <bits/stdc++.h>
using namespace std;

const int MOD = 1e9 + 7;

class Solution {
    int dfs(int left, int last, int len, vector<int>& rollMax, vector<vector<vector<int>>>& dp) {
        if (left == 0) return 1;
        if (dp[left][last][len] != -1) return dp[left][last][len];
        long long ans = 0;
        for (int i = 0; i < 6; i++) {
            if (i == last && rollMax[i] == len) continue;
            ans = (ans + dfs(left - 1, i, (i == last) ? len + 1 : 1, rollMax, dp)) % MOD;
        }
        return dp[left][last][len] = ans;
    }
public:
    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);
    }
};

int 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++-এ Line Reflection: ২D প্লেনে বিন্দুগুলোর Y-অক্ষ সমান্তরাল প্রতিফলন লাইন আছে কিনা যাচাই করা

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

  3. প্রসেস কিল করা (Kill Process) C++-এ

  4. স্কোয়ারেল সিমুলেশন (Squirrel Simulation) C++-এ