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

xorゲームの結果を0かどうかをチェックするC++プログラム


N個の要素と別のバイナリ文字列Sを持つ配列Aがあるとします。2人のプレーヤーがゲームをプレイしていると考えてください。それらは0と1として番号が付けられます。初期値が0である1つの変数xがあります。ゲームにはNラウンドがあります。 i番目のラウンドの人S[i]は、次のいずれかを実行します。xをx XOR A [i]に置き換えます。それ以外の場合は、何もしません。人物0は、このゲームの終了時に0を望んでいますが、人物1はゼロ以外を望んでいます。最後にxが0になるかどうかを確認する必要があります。

したがって、入力がA =[1、2]のような場合。 S ="10"の場合、person1はxを0 XOR 1 =1に変更するため、出力は1になります。したがって、person0による選択に関係なく、常に1になります。

ステップ

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

N := size of A
Define an array judge of size: 60.
z := 0
fill judge with 0
for initialize n := N - 1, when 0 <= n, update (decrease n by 1), do:
   x := A[n]
   loop through the following unconditionally, do:
      if x is same as 0, then:
         Come out from the loop
      y := x
      I := -1
      for initialize i := 0, when i < 60, update (increase i by 1), do:
         if y mod 2 is same as 1, then:
            I := i
         y := y / 2
      if judge[I] is same as 0, then:
         judge[I] := x
         Come out from the loop
      x := x XOR judge[I]
   if S[n] is not equal to '0', then:
      if x is not equal to 0, then:
         z := 1
return z

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

#include <bits/stdc++.h>
using namespace std;

int solve(vector<int> A, string S){
   int N = A.size();
   int judge[60];
   int z = 0;
   fill(judge, judge + 60, 0);
   for (int n = N - 1; 0 <= n; n--){
      int x = A[n];
      while (1){
         if (x == 0)
            break;
         int y = x;
         int I = -1;
         for (int i = 0; i < 60; i++){
            if (y % 2 == 1)
               I = i;
               y /= 2;
         }
         if (judge[I] == 0){
            judge[I] = x;
            break;
         }
         x ^= judge[I];
      }
      if (S[n] != '0'){
         if (x != 0)
            z = 1;
      }
   }
   return z;
}
int main(){
   vector<int> A = { 1, 2 };
   string S = "10";
   cout << solve(A, S) << endl;
}

入力

{ 1, 2 }, "10"

出力

1

  1. アレイが回文であるかどうか、またはC++でSTLを使用していないかどうかを確認するプログラム

    n個の整数の配列arr[n]が与えられた場合、タスクは配列が回文であるかどうかを見つけることです。 C++でSTLを使用して指定されたタスクを実行する必要があります。 C ++には、STL(標準テンプレートライブラリ)の機能があります。これは、データ構造と、スタック、キュー、リストなどのいくつかの機能を提供するために使用されるC ++テンプレートクラスのセットです。これらを使用するには、知識が必要です。テンプレートクラスの。 回文は、シーケンスの前または後ろから同じように読み取られるシーケンスです。回文の簡単な例としては、-MADAM、RACECARなどがあります。配列は、以下の例のような

  2. C++で配列のビットノイズをチェックするプログラム

    N個の整数の配列arr[N]が与えられた場合、タスクは、与えられた配列がバイトニックであるかどうかをチェックすることです。指定されたアレイがバイトニックである場合は、「はい、バイトニックアレイです」と出力します。そうでない場合は、「いいえ、バイトニックアレイではありません」と出力します。 Bitonicアレイとは、アレイが最初に厳密に昇順で、次に厳密に降順である場合です。 この配列のように、arr [] ={1、2、3、4、2、-1、-5}はバイトニック配列です。これは、4までは厳密に昇順であり、4以降は厳密に降順であるためです。 入力 arr[] = {1, 3, 5, 4,