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

細胞着色ゲームの勝者を見つけるためのC++プログラム


2つの配列AとBがあり、どちらもそれぞれN個の要素を持っているとします。 AmalとBimalが、セル番号が1からNまでのボードでゲームをプレイしていると考えてください。N-1道路。道路は2つのセルを接続しています。つまり、i番目の道路はA[i]とB[i]を接続しています。隣接するセルに繰り返し移動することにより、他のすべてのセルからすべてのセルに到達できます。最初、セル1は黒色でマークされ、セルNは白色でマークされています。他のセルは着色されていません。アマルが最初にプレイし、代わりにプレイします。 Amalは、黒いセルに隣接し、黒く塗られている色のないセルを選択します。 Bimalは、白いセルに隣接し、白く塗られている色のないセルを選択します。プレイヤーがセルをペイントできないとき、彼は緩みます。勝者を見つける必要があります。

したがって、入力がA =[3、1、3、7、5、1]のような場合; B =[6、2、1、4、7、4]の場合、出力はAmalになります。これは、Amalが最初にセル2を黒く塗った場合、Bimalの動きに関係なく勝つためです。

ステップ

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

N := 99999
Define one adjacency list adjList
Define three large arrays p, d, and ssz
Define a function dfs(), this will take nd, par, dep,
   p[nd] := par
   d[nd] := dep
   ssz[nd] := 1
   for each node i in adjList[nd], do
      if i XOR par is non-zero, then:
         dfs(i, nd, dep + 1)
         ssz[nd] := ssz[nd] + ssz[i]
From the main method, do the following:
n := size of A
for initialize i := 1, when i < n, update (increase i by 1), do:
   u := A[i - 1], v := B[i - 1]
   insert v at the end of adjList[u]
   insert u at the end of adjList[v]
dfs(1, 1, 0)
nd := n
for initialize i := 0, when i < (d[n] - 1) / 2, update (increase i by 1), do:
   nd := p[nd]
return if 2 * ssz[nd] >= n, then "Bimal", otherwise "Amal"

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

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

int N = 99999;

vector<vector<int>> adjList(N);
vector<int> p(N), d(N), ssz(N);

void dfs(int nd, int par, int dep){
   p[nd] = par;
   d[nd] = dep;
   ssz[nd] = 1;
   for (int i : adjList[nd]){
      if (i ^ par){
         dfs(i, nd, dep + 1);
         ssz[nd] += ssz[i];
      }
   }
}
string solve(vector<int> A, vector<int> B){
   int n = A.size();
   for (int i = 1; i < n; i++){
      int u = A[i - 1], v = B[i - 1];
      adjList[u].push_back(v);
      adjList[v].push_back(u);
   }
   dfs(1, 1, 0);
   int nd = n;
   for (int i = 0; i < (d[n] - 1) / 2; i++)
      nd = p[nd];
   return (2 * ssz[nd] >= n ? "Bimal" : "Amal");
}
int main(){
   vector<int> A = { 3, 1, 3, 7, 5, 1 };
   vector<int> B = { 6, 2, 1, 4, 7, 4 };
   cout << solve(A, B) << endl;
}

入力

{ 3, 1, 3, 7, 5, 1 }, { 6, 2, 1, 4, 7, 4 }

出力

Amal

  1. Pythonで配列除去ゲームの勝者を見つけるプログラム

    AmalとBimalが、いくつかの数字を持つ1つの配列Aを持つゲームをプレイしているとします。ゲームのルールは次のとおりです Bimalは常に開始します 各ターンで、1人のプレーヤーが配列から最大の要素を削除し、削除された要素の右側にある他のすべての要素も削除されます。 交互にプレイします 残りの要素をすべて削除したプレーヤーは、ゲームに勝ちます。 したがって、入力がnums =[5,2,6,3,4]の場合、出力はAmalになります。これは、最初にBimalが[6,3,4]を削除するため、配列が[5,2]になるためです。その後、アマルはすべてを削除するので、彼が勝者になります。 これを

  2. Pythonで石のゲームの勝者を見つけるためのプログラム

    AmalとBimalがゲームをプレイしていて、Amalの番が最初であるとします。ゲームは以下のようなものです- 石が山積みになっています。各プレイヤーは山から石を取り、その石の位置に基づいてポイントを受け取ることができます。アマルとビマルは石を異なる方法で評価するかもしれません。 同じ長さの2つの配列、A_ValuesとB_Valuesがあります。各A_Values[i]とB_Values[i]は、それぞれAmalとBimalがi番目の石をどのように評価するかを表します。ここでスコアが最大の場合、すべての石が取り出された後、彼が勝者になります。同点の場合、ゲームは引き分けになります。両方の