1. 程式人生 > >(zst的博弈) 【推理+找規律】

(zst的博弈) 【推理+找規律】

size one img 參考 每次 blog 給定 style int

題目:

甲乙兩人玩一個遊戲: 一張卡片上有個數字,甲乙兩人輪流操作, 若當前卡片上的數字為x, 每次操作可以把它變為x+1或2x, 且不能超過n (例如n=8,x=6,只能變為7而不能變為12), 每次甲首先在卡片上寫1,規定寫n的人獲勝。給定n, 問甲是否有必勝策略?


分析: 看起來像一道博弈論的題,但實際上僅需細心的推理,耐心的找規律即可。 1、因為甲先寫的1,所以乙的所有奇數全部要從甲的偶數哪裏加1得來,因此如果n為奇數,甲只要保證自己寫的數全是 奇數即可,因此奇數的情況下,甲贏。 2、發現因為從 n/2 到 n 兩人只能一個一個加上去,因此從 n/2 到 n (n為偶數)中的所有偶數為必勝狀態。而從 n/4 到 n/2 中的任何一個數乘以2均可跳到 n/2 到 n 的偶數狀態,即為必勝狀態,因此誰先寫下 n/4 到 n/2 中的數,誰就必 勝。而只要某一個人寫下了 n/4 ,對方雖然不會主動乘以2,但當他加了1以後,此人可立即乘以2跳到 n/2 至 n中 的偶數 ,因此誰寫下 n/2 誰就必勝。 綜上:n/4 是一個必勝周期。
參考代碼: 技術分享
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int t;
long long n;
bool dfs(long long n)
{
    if(n==2)
        return 0;
    else if(n%2)
        return 1;
    else
        return dfs(n/4);
}

int main()
{
    cin
>>t; while(t--) { cin>>n; bool f=dfs(n); if(f) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
View Code

(zst的博弈) 【推理+找規律】