Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ . में पासा रोल सिमुलेशन

मान लीजिए कि एक डाई सिम्युलेटर प्रत्येक रोल के लिए 1 से 6 तक एक यादृच्छिक संख्या उत्पन्न करता है। हम जनरेटर के लिए एक बाधा पेश करना चाहते हैं जैसे कि यह लगातार बार रोलमैक्स [i] (1-अनुक्रमित) से अधिक संख्या को रोल नहीं कर सकता है। विचार करें कि हमारे पास पूर्णांक रोलमैक्स और एक पूर्णांक n की एक सरणी है, हमें अलग-अलग अनुक्रमों की संख्या वापस करनी होगी जिन्हें सटीक n रोल के साथ प्राप्त किया जा सकता है। दो अनुक्रम अलग माने जाते हैं यदि कम से कम एक तत्व एक दूसरे से भिन्न होता है। तो अगर n 2 है, तो रोलमैक्स =[1,1,2,2,2,3], तो आउटपुट 34 होगा। तो मरने पर 2 रोल होंगे, अगर कोई बाधा नहीं है, तो पासे पर हैं 6*6 =36 संभावित संयोजन, इस स्थिति में संख्या 1 और 2 लगातार एक बार अधिक से अधिक दिखाई देते हैं, इसलिए क्रम (1,1) और (2,2) नहीं हो सकते। तो अंतिम उत्तर 36 - 2 =34 होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डीएफएस () नामक एक विधि बनाएं, इसमें डाईलेफ्ट, लास्ट, करलेन, एरे आर और मैट्रिक्स डीपी लगेगी
  • यदि dieLeft =0 है, तो 1 लौटाएं
  • यदि dp[dieLeft][last][currLen] -1 नहीं है, तो dp[dieLeft, last, currLen] पर वापस लौटें।
  • काउंटर:=0
  • मैं के लिए 0 से 6 की सीमा में
    • यदि i =अंतिम और r[i] =currLen, तो अगला भाग छोड़ें और अगले पुनरावृत्ति के लिए जाएं
    • काउंटर:=dfs(dieLeft-1, i, currLen + 1 जब i =लास्ट, अन्यथा 1, r, dp)
  • dp[dieLeft, last, currLen] :=काउंटर
  • रिटर्न dp[dieLeft, last, currLeft]
  • मुख्य विधि इस प्रकार होगी -
  • dp ऑफ़ ऑर्डर (n + 1) x 6 x 16 नामक एक 3D सरणी बनाएं और इसे -1 से भरें
  • रिटर्न डीएफएस (एन, 0, 0, रोलमैक्स, डीपी)

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प

  1. सी ++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट हैं। स्थितियों को 2डी ग्रिड में कोशिकाओं द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नटों को इकट्ठा करने और उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी का पता लगाना है। गिलहरी एक समय में केवल एक अखरोट ले सकती है और चार दिशाओं में - ऊपर, नीचे, बाएँ औ