Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

सेल कलरिंग गेम के विजेता को ढूंढने के लिए C++ प्रोग्राम


मान लीजिए हमारे पास N-तत्वों वाले दो ऐरे A और B हैं। अमल और बिमल 1 से N तक गिने गए सेल नंबर वाले बोर्ड पर एक खेल खेल रहे हैं। और N-1 सड़कें हैं। सड़कें दो सेल को जोड़ती हैं। इसलिए iवीं सड़क A[i] को B[i] से जोड़ती है। प्रत्येक सेल को बार-बार आसन्न सेल की यात्रा करके हर दूसरे सेल से पहुंचा जा सकता है। प्रारंभ में सेल 1 को काले रंग से चिह्नित किया गया है, और सेल N सफेद। अन्य सेल रंगीन नहीं हैं। अमल पहले खेलता है, और वे बारी-बारी से खेलते हैं। अमल एक अकलर्ड सेल चुनता है जो काले सेल से आसन्न है और उसे काला रंगता है। बिमल एक अकलर्ड सेल चुनता है जो सफेद सेल से आसन्न है और उसे सफेद रंगता है। जब कोई खिलाड़ी सेल को रंग नहीं सकता, तो वह हार जाता है। हमें विजेता ढूंढना है।

उदाहरण के लिए, यदि इनपुट A = [3, 1, 3, 7, 5, 1]; B = [6, 2, 1, 4, 7, 4] है, तो आउटपुट अमल होगा, क्योंकि यदि अमल पहले सेल 2 को काला रंगता है, तो वह बिमल की चालों की परवाह किए बिना जीत जाएगा।

चरण

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:

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 का आकार i := 1 से n-1 तक, करें: u := A[i - 1], v := B[i - 1] v को adjList[u] के अंत में डालें u को adjList[v] के अंत में डालें dfs(1, 1, 0) nd := n i := 0 से (d[n] - 1) / 2 - 1 तक, करें: nd := p[nd] यदि 2 * ssz[nd] >= n, तो "बिमल" वापस करें, अन्यथा "अमल" वापस करें

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#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. - पायथन में संख्या घटाने वाले गेम के विजेता को खोजने का प्रोग्राम

    मान लीजिए अमल और बिमल एक गेम खेल रहे हैं। उनके पास एक संख्या n है और वे जांचते हैं कि यह 2 की घात है या नहीं। यदि यह है, तो वे इसे 2 से विभाजित करते हैं। अन्यथा, वे इसे अगली निचली संख्या से घटाते हैं जो 2 की घात भी है। जो भी संख्या को 1 तक घटाता है वह गेम जीत जाएगा। अमल हमेशा गेम शुरू करता है, फिर ह

  1. - पायथन में सरणी हटाने वाले गेम के विजेता को खोजने का प्रोग्राम

    मान लीजिए अमल और बिमल एक गेम खेल रहे हैं जहां उनके पास कुछ संख्याओं वाली एक सरणी A है। गेम के नियम इस प्रकार हैं:बिमल हमेशा शुरू करेगाप्रत्येक चाल में एक खिलाड़ी सरणी से अधिकतम तत्व को हटा देता है और हटाए गए तत्व के दाईं ओर मौजूद अन्य सभी तत्व भी हटा दिए जाएंगे।वे बारी-बारी से खेलते हैंजो खिलाड़ी सभ

  1. - पायथन में स्टोन गेम के विजेता ज्ञात करने का प्रोग्राम

    मान लीजिए अमल और बिमल एक खेल खेल रहे हैं और अमल की बारी पहले है। खेल इस प्रकार है: एक ढेर में n पत्थर हैं। प्रत्येक खिलाड़ी ढेर से एक पत्थर ले सकता है और उस पत्थर की स्थिति के आधार पर अंक प्राप्त कर सकता है। अमल और बिमल पत्थरों को अलग तरीके से महत्व दे सकते हैं। हमारे पास समान लंबाई की दो सरणियाँ ह