Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การจำลองลูกเต๋าใน C ++


สมมติว่าเครื่องจำลองการตายสร้างตัวเลขสุ่มตั้งแต่ 1 ถึง 6 สำหรับแต่ละม้วน เราต้องการแนะนำข้อ จำกัด ให้กับตัวสร้างเพื่อไม่ให้หมุนหมายเลข i มากกว่า rollMax[i] (1-indexed) ติดต่อกัน พิจารณาว่าเรามีอาร์เรย์ของจำนวนเต็ม rollMax และจำนวนเต็ม n เราต้องคืนค่าจำนวนลำดับที่แตกต่างกันที่สามารถรับได้ด้วย n ม้วนที่แน่นอน ทั้งสองลำดับจะถือว่าแตกต่างกันหากองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบแตกต่างกัน ดังนั้นถ้า n เป็น 2 แล้ว rollMax =[1,1,2,2,2,3] ผลลัพธ์จะเป็น 34 ดังนั้นจะมี 2 ม้วนบนแม่พิมพ์ หากไม่มีข้อจำกัด บนแม่พิมพ์จะมี 6*6 =36 ชุดค่าผสมที่เป็นไปได้ ในกรณีนี้ หมายเลข 1 และ 2 ปรากฏอย่างมากที่สุด 1 ครั้งติดต่อกัน ดังนั้นลำดับ (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
  • สำหรับ i ในช่วง 0 ถึง 6
    • ถ้า i =สุดท้าย และ r[i] =currLen ให้ข้ามส่วนถัดไปและทำซ้ำต่อไป
    • ตัวนับ :=dfs(dieLeft – 1, i, currLen + 1 เมื่อ i =สุดท้าย มิฉะนั้น 1, r, dp)
  • dp[dieLeft, last, currLen] :=ตัวนับ
  • ส่งคืน dp[dieLeft, สุดท้าย, currLeft]
  • วิธีหลักจะเป็นเช่น −
  • สร้างอาร์เรย์ 3 มิติที่เรียกว่า dp of order (n + 1) x 6 x 16 แล้วเติมด้วย -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