C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのダイスロールシミュレーション


ダイシミュレーターがロールごとに1から6までの乱数を生成するとします。ジェネレーターに制約を導入して、数値iをrollMax [i](1インデックス)を超えて連続してロールできないようにします。整数rollMaxと整数nの配列があるとすると、正確なn回のロールで取得できる個別のシーケンスの数を返す必要があります。少なくとも1つの要素が互いに異なる場合、2つのシーケンスは異なると見なされます。したがって、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()という1つのメソッドを作成します。これには、dieLeft、last、currLen、array r、matrixdpが必要です
  • dieLeft =0の場合、1を返します
  • dp [dieLeft] [last] [currLen]が-1でない場合は、dp [dieLeft、last、currLen]を返します
  • カウンター:=0
  • 0から6の範囲のiの場合
    • i=lastおよびr[i]=currLenの場合、次の部分をスキップして次の反復に進みます
    • counter:=dfs(dieLeft – 1、i、currLen + 1(i =lastの場合、それ以外の場合は1、r、dp)
  • dp [dieLeft、last、currLen]:=カウンター
  • return dp [dieLeft、last、currLeft]
  • 主な方法は次のようになります-
  • 次数(n + 1)x 6 x 16のdpと呼ばれる1つの3D配列を作成し、これに-1を入力します
  • return 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++でプロセスを強制終了します

    n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。 各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。 これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。 プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリ

  2. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で