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

C++でゲームIIを反転する


フリップゲームをプレイしている2人のプレーヤーがいるとします。ここに、次の2つの文字のみを含む文字列があります。+と-、player1とplayer2は、2つの連続する「++」を「-」に交互に反転します。 1人のプレーヤーが移動できなくなったときにゲームが終了するため、もう1人のプレーヤーが勝者になります。スターティングプレイヤーが勝利を保証できるかどうかをチェックする関数を定義する必要があります。

したがって、入力がs ="++++"の場合、出力はtrueになります。これは、開始プレーヤーが中央の"++"を反転して"+-+"になることで勝利を保証できるためです。

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

  • 1つのマップメモを定義する

  • 関数solve()を定義します。これにはsがかかります

  • メモにsがある場合、-

    • メモを返す

  • 可能:=false

  • n:=sのサイズ

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

    • s[i]が'+'と同じで、s [i +1]が'+'と同じ場合、-

      • s [i]:='-'、s [i + 1]:='-'

      • 可能:=可能またはsolve(s)の逆

      • s [i]:='+'、s [i + 1]:='+'

      • 可能であればゼロ以外の場合、-

        • メモを返す:=可能

  • メモを返す:=可能

  • メインの方法から次のようにします-

  • 解決を返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   unordered_map <string, bool> memo;
   bool solve(string s){
      if (memo.count(s))
         return memo[s];
      bool possible = false;
      int n = s.size();
      for (int i = 0; i < n - 1; i++) {
         if (s[i] == '+' && s[i + 1] == '+') {
            s[i] = '-';
            s[i + 1] = '-';
            possible |= !solve(s);
            s[i] = '+';
            s[i + 1] = '+';
            if (possible)
               return memo[s] = possible;
         }
      }
      return memo[s] = possible;
   }
   bool canWin(string s) {
      return solve(s);
   }
};
main(){
   Solution ob;
   cout << (ob.canWin("++++"));
}

入力

"++++"

出力

1

  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