Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ หาผู้ชนะเกมระบายสีเซลล์


สมมติว่าเรามีสองอาร์เรย์ A และ B ทั้งคู่มีองค์ประกอบ N แต่ละตัว พิจารณา Amal และ Bimal กำลังเล่นเกมบนกระดานที่มีหมายเลขเซลล์ตั้งแต่ 1 ถึง N และถนน N-1 ถนนเชื่อมต่อสองเซลล์ ดังนั้นถนนจึงเชื่อม A[i] กับ B[i] ทุกเซลล์สามารถเข้าถึงได้จากทุกเซลล์โดยการเดินทางซ้ำๆ ไปยังเซลล์ที่อยู่ติดกัน เริ่มแรก เซลล์ 1 จะถูกทำเครื่องหมายเป็นสีดำ และเซลล์ N เป็นสีขาว เซลล์อื่นไม่มีสี Amal เล่นก่อน และพวกเขากำลังเล่นอีกทางหนึ่ง Amal เลือกเซลล์ที่ไม่มีสีซึ่งอยู่ติดกับเซลล์สีดำและทาสีดำ Bimal เลือกเซลล์ที่ไม่มีสีซึ่งอยู่ติดกับเซลล์สีขาวและทาสีขาว เมื่อผู้เล่นไม่สามารถทาสีเซลล์ได้ เขาจะแพ้ เราต้องหาผู้ชนะให้ได้

ดังนั้น ถ้าอินพุตเป็น A =[3, 1, 3, 7, 5, 1]; B =[6, 2, 1, 4, 7, 4] ผลลัพธ์จะเป็น Amal เพราะถ้า Amal ลงสีเซลล์ 2 เป็นสีดำก่อน เขาจะชนะโดยไม่คำนึงถึงการเคลื่อนไหวของ Bimal

ขั้นตอน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

N :=99999Define one adjacency list adjListDefine three large arrays p, d, and sszDefine a function dfs() ซึ่งจะใช้เวลา nd, par, dep, p[nd] :=par d[nd] :=dep ssz [nd] :=1 สำหรับแต่ละโหนด i ใน adjList[nd] ทำถ้า i XOR par ไม่ใช่ศูนย์ แล้ว:dfs(i, nd, dep + 1) ssz[nd] :=ssz[nd] + ssz [i]จากวิธีหลัก ให้ทำดังนี้:n :=size of Afor initialize i :=1, when i =n จากนั้น "Bimal" มิฉะนั้น "Amal" 

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include ใช้เนมสเปซ std;int N =99999;vector> adjList(N);vector p(N), d(N), ssz(N) );void dfs(int nd, int par, int dep){ p[nd] =ตราไว้หุ้นละ; d[nd] =เดป; ssz[nd] =1; สำหรับ (int i:adjList[nd]){ if (i ^ par){ dfs(i, nd, dep + 1); ssz[nd] +=ssz[i]; } }}การแก้สตริง (เวกเตอร์ A, เวกเตอร์ B){ int n =A.size(); สำหรับ (int i =1; i =n ? "Bimal" :"Amal");}int main(){ vector A ={ 3, 1, 3, 7, 5, 1 }; เวกเตอร์ B ={ 6, 2, 1, 4, 7, 4 }; ศาล <<แก้ (A, B) < 

อินพุต

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

ผลลัพธ์

อามาล