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

C++のボックスから入手できる最大のキャンディー


n個のボックスがあるとします。ここでは、各ボックスが[status、candies、keys、containedBoxes]のような形式で指定されています。いくつかの制約があります-

  • status [i]:ボックス[i]が開いているときは1、ボックス[i]が閉じているときは0です。

  • candies [i]:ボックス[i]内のキャンディーの数です。

  • keys [i]:box[i]のキーで開くことができるボックスのインデックスを含む配列です。

  • containsBoxes [i]:配列には、box[i]で見つかったボックスのインデックスが含まれています。

initialBoxes配列で指定されたいくつかのボックスから始めます。開いている箱にすべてのキャンディーを入れることができ、その中の鍵を使って新しい箱を開けることができます。また、中にある箱を使うこともできます。

上記のルールに従って、入手できるキャンディーの最大数を見つける必要があります。

したがって、入力がstatus =[1,0,1,0]、candies =[8,6,5,101]、keys =[[]、[]、[1]、[]]の場合、containedBoxes =[ [1,2]、[3]、[]、[]]、initialBoxes =[0]の場合、出力は19になります。これは、最初にボックス0が与えられるためです。8つのキャンディーとボックスがあります。ボックス1は開かれておらず、キーがないため、ボックス2を開きます。ボックス2に5つのキャンディーとボックス1のキーがあります。ボックス1には、6つのキャンディーとボックス3ですが、ボックス3のキーが見つからないため、ボックス3は閉じたままになります。集められたキャンディーの総数=8+ 5 + 6=19キャンディー。

これを解決するには、次の手順に従います-

  • ans:=0

  • 1つのキューを定義するq

  • 訪問、オープン、hasKey

    のセットを定義します
  • 初期化i:=0の場合、i

    • x:=ib [i]

    • 訪問済みにxを挿入

    • st [x]が1と同じ場合、-

      • ans:=ans + cnt [x]

      • 開いた状態にxを挿入します

      • xをqに挿入

  • (qが空ではない)間、-

    • curr:=qの最初の要素

    • qから要素を削除

    • 初期化i:=0の場合、i

      • x:=k [curr、i]

      • xをhasKeyに挿入

      • xが開かれておらず、xが訪問されていない場合、-

        • ans:=ans + cnt [x]

        • xをqに挿入

        • 開いた状態にxを挿入します

    • 初期化i:=0の場合、i

      • x:=cb [curr、i]

      • 訪問済みにxを挿入

      • xが開いておらず、xがhasKeyにあるか、st [x]が1)と同じである場合、-

        • 開いた状態にxを挿入します

        • ans:=ans + cnt [x]

        • xをqに挿入

  • ansを返す

理解を深めるために、次の実装を見てみましょう-

 #include usingnamespace std; class Solution {public:int maxCandies(vector &st、vector &cnt、vector >&k、vector >&cb、vector &ib){int ans =0; queue  q; setが訪問しました。 setが開かれました。 set  hasKey; for(int i =0; i  v ={1,0,1,0}、v1 ={8,6,5,101}、v2 ={0}; vector > v3 ={{}、{}、{1}、{}}、v4 ={{1,2}、{3}、{0}、{}}; cout <<(ob.maxCandies(v、v1、v3、v4、v2));} 

入力

 {1,0,1,0}、{8,6,5,101}、{{}、{}、{1}、{}}、{{1,2}、{3}、{0} 、{}}、{0} pre> 

出力

 19 

  1. C++でN*Nチェス盤に配置できる最大のビショップ

    チェス盤のサイズを示す入力Nが与えられます。ここでのタスクは、Nの任意の値について、2人のビショップが互いに攻撃できないようにNXNチェス盤に配置できるビショップの数を見つけることです。例を挙げて理解しましょう。 入力 − n =2 出力 − N * Nチェス盤に配置できる最大のビショップ− 2(上記のように) 説明 −上に示したように、矛盾しない位置は司教が配置されている場所だけです。せいぜい2X2チェス盤のビショップ。 入力 − n =5 出力 − N * Nチェス盤に配置できる最大ビショップ:8(上記のように) 以下のプログラムで使用されているアプローチは次のとおりで

  2. C++で下から右に光を転送できる最大ミラー

    0と1のみを含む正方行列が与えられます。 0は空白または空の場所を表し、1は障害物を意味します。これらのミラーが下から右に光を転送できるように、空のセルに配置できるミラーをいくつか見つける必要があります。これは、ミラーがインデックス[i、j]に配置され、その特定の行(i)の右側のすべてのセルと、その特定の列の下部(j)のセルに障害物がない場合に可能です。 ミラーがA[i][j]にある場合、すべてのA [i+1からn][j]およびA[i][j + 1からn]は空、つまり0です。次の図に示すように。 入力 Arr[][] = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0