思路
KING n,m 都为奇数 先手胜
ROOK m==n 先手必输
KNIGHT 令n < m , m%3==0 && n==m-1必输态, m==n && n%3==1 必胜态, 其余 和棋
QUEEN n– and m– (这个地方比赛时没注意,一直WA T_T) 构成威佐夫博弈。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> #include <stack> #include <cstring> using namespace std; int n,m; bool king(){ if(m%2==1 && n%2==1)return 0; return 1; } bool rook(){ if(n==m)return 0; return 1; } int knight(){ if(m<n)swap(m,n); if(m%3==0 && n==m-1) return 1; else if(m==n && m%3==1) return -1; return 0; } bool queen(){ n--;m--; if(m<n)swap(m,n); bool ans=1; if((int)((m-n)*(sqrt(5.0)+1.0)/2.0)==n) ans=0; return ans; } int main(){ int T;scanf("%d",&T); while(T--){ int type;int ans=0; scanf("%d%d%d",&type,&n,&m); if(type==1) ans=king(); else if(type==2)ans=rook(); else if(type==3)ans=knight(); else ans=queen(); if(type!=3){ if(ans){ puts("B"); } else puts("G"); } else{ if(ans>0) puts("B"); else if(ans==0) puts("D"); else puts("G"); } } return 0; }
|