这把多校打得非常崩,来补一下。找规律的话,感觉后是最难的,马次之,好久不碰威佐夫博弈了,复习一下,模型是这样的:有两堆石子,两人轮流拿,可以从其中一堆拿任意个,或者两堆拿相同个数,拿完的人赢。假设当前两堆分别是
n
和
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <sstream>
using namespace std;
#define ll long long
int main(){
int t;
cin>>t;
while(t--){
int n,m;
int type;
cin>>type>>n>>m;
n--;
m--;
if(type == 1){ //king
if( (n%2) == 0 && (m%2) == 0){
puts("G");
}else{
puts("B");
}
} else if(type == 2){ //rook
if(n==m){
puts("G");
}else{
puts("B");
}
}else if (type == 3){ //knight
if((n+m)%3==0){
if(n==m){
puts("G");
}else{
if(n<m){
swap(n,m);
}
n-=2;
m-=1;
if(n==m){
puts("B");
}else{
puts("D");
}
}
}else{
puts("D");
}
}else{ //queen
if(n<m){
swap(n,m);
}
int delta = n-m;
if( m == (int)(delta*(sqrt(5)+1)/2) ){
puts("G");
}else{
puts("B");
}
}
}
return 0;
}