কম্পিউটার টিউটোরিয়াল

C++ প্রোগ্রাম: সেল রঙ করার গেমের বিজয়ী খুঁজে বের করা

মান লিখুন: আমাদের কাছে N উপাদান বিশিষ্ট দুটি অ্যারে A এবং B আছে। আমল এবং বিমল একটি বোর্ডে খেলছেন যাতে 1 থেকে N পর্যন্ত নম্বর দেওয়া সেল আছে। N-1টি রোড আছে যা দুটি সেল সংযুক্ত করে। i-তম রোড A[i]-কে B[i]-এর সাথে সংযুক্ত করে। যেকোনো সেল যেকোনো অন্য সেল থেকে পৌঁছানো যায়। শুরুতে সেল ১ কালো রঙের, এবং সেল N সাদা রঙের। বাকি সেলগুলো রঙীন নয়। আমল প্রথম খেলে, তারপর তারা বালীল বালীল খেলে। আমল একটি অনরঙীন সেল নির্বাচন করে যা কালো সেলের সাথে সন্নিহিত এবং সেটি কালো রঙ দেয়। বিমল একটি অনরঙীন সেল নির্বাচন করে যা সাদা সেলের সাথে সন্নিহিত এবং সেটি সাদা রঙ দেয়। যেনে খেলোয়ার কাউকে রঙ দিতে না পারলে সে হারে। বিজয়ী কে তা বের করতে হবে।

উদাহরণ

যদি ইনপুট হয় A = [3, 1, 3, 7, 5, 1]; B = [6, 2, 1, 4, 7, 4], তবে আউটপুট হবে "Amal", কারণ আমল যদি প্রথমে সেল ২ কালো করে, তবে বিমল যেভাবে খেলুক না কেন আমল জিতবে।

সমাধানের ধাপসমূহ

N := 99999
adjList এডজেসেন্সি লিস্ট
p, d, ssz অ্যারে

dfs(nd, par, dep) ফাংশন:
    p[nd] := par
    d[nd] := dep
    ssz[nd] := 1
    adjList[nd]-এর প্রতিটি নোড i এর জন্য:
        যদি i XOR par নন-জিরো:
            dfs(i, nd, dep+1)
            ssz[nd] := ssz[nd] + ssz[i]

মূল ফাংশন:
    n := A এর আকার
    for i := 1 থেকে n-1:
        u := A[i-1], v := B[i-1]
        adjList[u]-তে v যোগ করুন
        adjList[v]-তে u যোগ করুন
    dfs(1, 1, 0)
    nd := n
    for i := 0 থেকে (d[n]-1)/2 - 1:
        nd := p[nd]
    যদি 2*ssz[nd] >= n: "Bimal" রিটার্ন করুন
    অন্যথায়: "Amal" রিটার্ন করুন

C++ বাস্তবায়ন

#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. পাইথনে টাওয়ার রিডিউসিং গেমের বিজয়ী খুঁজে বের করা

  2. পাইথনে নাম্বার রিডিউসিং গেমের বিজয়ী খুঁজে বের করা

  3. পাইথনে অ্যারে রিমভাল গেমের বিজয়ী খুঁজে বের করা

  4. পাইথনে স্টোন গেমের বিজয়ী বের করার প্রোগ্রাম