1. 程式人生 > >POJ.1704.Georgia and Bob(博弈論 Nim)

POJ.1704.Georgia and Bob(博弈論 Nim)

std urn script desc sdi log define gis include

題目鏈接

\(Description\)

一個1~INF的坐標軸上有n個棋子,給定坐標Pi。棋子只能向左走,不能跨越棋子,且不能越界(<1)。兩人每次可以將任意一個可移動的棋子向左移動一個單位。問先/後手會贏或是否無解。

\(Solution\)

首先考慮相鄰兩個棋子
無論一個人怎麽移動前邊的棋子,後手都能移動後面棋子同樣的距離使得這兩個棋子間間隔不變
同時兩個棋子局面的終止是兩個棋子相鄰
不難想到以這兩個棋子間距離為石子數做一個Nim遊戲
那擴展到n個棋子?
兩兩配對,對於每一對看做一個Nim遊戲
當棋子數為奇數時需要將第一個棋子和點1看做一對
狀態是有限的 不會無解

//332K 0ms
#include <cstdio>
#include <cctype> #include <algorithm> #define gc() getchar() int A[1005]; inline int read() { int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now; } int main() { int t=read(),n,res,i; while(t--) { n=read(); for
(i=1; i<=n; ++i) A[i]=read(); std::sort(A+1,A+1+n); if(n&1) for(res=A[1]-1,i=2; i<=n; i+=2) res^=(A[i+1]-A[i]-1); else for(res=0,i=1; i<=n; i+=2) res^=(A[i+1]-A[i]-1); puts(res?"Georgia will win"
:"Bob will win"); } return 0; }

POJ.1704.Georgia and Bob(博弈論 Nim)