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

เกม XOR กระดานดินสอ (Chalkboard XOR Game) ใน C++


ภาพรวมปัญหา

สมมติว่ามีอาร์เรย์ nums ที่ตัวเลขถูกเขียนบนกระดานดินสอ ราม (Ram) และ แซม (Sam) สลับกันลบตัวเลขทีละ 1 ตัวจากกระดาน โดยรามเริ่มก่อน หากการลบตัวเลขทำให้ XOR แบบบิตของทุกตัวเลขบนกระดานกลายเป็น 0 ผู้เล่นคนนั้นจะแพ้ XOR ของ 1 ตัวคือตัวมันเอง XOR ของไม่มีตัวเลขคือ 0 หากผู้เล่นเริ่มเทิร์นด้วย XOR ของทุกตัวเลข = 0 ผู้เล่นคนนั้นจะชนะ

ตัวอย่าง

nums = [1, 2, 1] รามสามารถลบ 1 หรือ 2 ได้

  • ถ้ารามลบ 1 → เหลือ [2,1] XOR = 3 แซมลบตัวไหนก็ได้ เพราะรามจะต้องลบตัวสุดท้ายและแพ้
  • ถ้ารามลบ 2 → เหลือ [1,1] XOR = 0 รามแพ้ทันที

แนวทางแก้ปัญหา

สังเกตว่า: รามชนะได้ก็ต่อเมื่อ XOR ของทั้งอาร์เรย์ = 0 หรือ จำนวนตัวเลขเป็นจำนวนคู่

  • n := ขนาดของ nums
  • x := XOR ของทุกตัวใน nums
  • คืนค่า true ถ้า x == 0 หรือ n % 2 == 0

ตัวอย่างโปรแกรม

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

class Solution {
public:
    bool xorGame(vector<int>& nums) {
        int n = nums.size();
        int x = 0;
        for(int i : nums) x ^= i;
        return x == 0 || n % 2 == 0;
    }
};

int main() {
    Solution ob;
    vector<int> v = {1, 2, 1};
    cout << (ob.xorGame(v)); // 0 (false)
}

Input

{1,2,1}

Output

0