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

C++でのカードフリッピングゲーム


テーブルにN枚のカードがあり、各カードの両面に正の整数が印刷されているとします(おそらく異なる)。カードをいくつでも裏返す必要があり、1枚のカードを選んだ後。選択したカードの裏側にある番号Xがどのカードの表側にもない場合、番号Xは良好であると見なされます。良い最小の数を見つけなければなりませんか?良い数字がない場合は0を返します。ここで、fronts[i]とbacks[i]は、カードiの表と裏の番号を表します。フリップすると表と裏の数字が入れ替わるため、表の値が裏になり、その逆も同様です。

したがって、入力がfronts=[1,2,4,4,7]およびbacks=[1,3,4,1,3]のようである場合、出力は2になります。したがって、2番目のカードを裏返すと、表の値は[1,3,4,4,7]になり、裏の値は[1,2,4,1,3]になります。 2枚目のカードを選びます。これは裏面に2があり、どのカードの表面にもないので、2が適切な数字です。

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

  • セットを定義するs、n:=前線のサイズ、ret:=inf
  • 0からn–1の範囲のiの場合
    • fronts [i] =back [i]の場合、fronts[i]をsに挿入します
  • 0からn–1の範囲のiの場合
    • 前線[i]がセットの場合、ret:=最小のretと前線[i]
  • 0からn–1の範囲のiの場合
    • backs [i]が設定されていない場合、ret:=retとbacksの最小値[i]
  • ret =infの場合は0を返し、それ以外の場合はretを返します。

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int flipgame(vector<int>& fronts, vector<int>& backs) {
      set <int> s;
      int n = fronts.size();
      int ret = INT_MAX;
      for(int i = 0; i < n; i++){
         if(fronts[i] == backs[i])s.insert(fronts[i]);
      }
      for(int i = 0; i <n; i++ ){
         if(s.count(fronts[i]) == 0) ret = min(ret, fronts[i]);
      }
      for(int i = 0; i <n; i++ ){
         if(s.count(backs[i]) == 0) ret = min(ret, backs[i]);
      }
      return ret == INT_MAX? 0 : ret;
   }
};
main(){
   vector<int> v1 = {1,2,4,4,7};
   vector<int> v2 = {1,3,4,1,3};
   Solution ob;
   cout << (ob.flipgame(v1, v2));
}

入力

[1,2,4,4,7]
[1,3,4,1,3]

出力

2

  1. C++でゲームIVをジャンプする

    arrという整数の配列があるとします。最初はインデックス0にいます。1つのステップで、インデックスiからi + xにジャンプできます。ここで、i +x =0。jここで:arr[i]とarr[j]は同じであり、iとjは同じではありません。ここで、nは配列のサイズです。配列の最後のインデックスに到達するための最小ステップ数を見つける必要があります。 したがって、入力が次のような場合、 その場合、出力は3になります。インデックス0から4、3から9への3つのジャンプが必要です。 これを解決するには、次の手順に従います- 1つのマップを定義するm n:=arrのサイズ 初期

  2. C++でゲームVをジャンプする

    arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックスiから-にジャンプできます。 i + xここで、i +x