题目描述:棋盘上位于(1,1)处有一枚棋子,这枚棋子可能是国际象棋中王、车、马、后当中的一种,两个人依次移动
棋子,率先到达(n,m)点的人就算赢,注意,棋子只能向右、向下、向右下移动,现给出棋子的种类,以及
棋子,率先到达(n,m)点的人就算赢,注意,棋子只能向右、向下、向右下移动,现给出棋子的种类,以及
n和m的值,先手必胜则输出B,先手必败输出G,先手既非必胜又非必败(即没人走到(n,m))则输出D
思路:根据必胜态和必败态的判断理论,在棋盘上填0和1来判断该位置是必胜态还是必败态,其中王、车、马的判断很容易,后的不太好通过n,m直接判断,可以预处理出棋盘来,再直接根据棋盘上该点处是0或1来判断必胜或必败。
注意,马可能会有输出D的情况,而且马的棋盘填充如果用bfs预处理就GG了,因为这个wa了好多次,还是要谨慎判断
图中含义为选取右下角的点作为(n,m)的话的胜败情况,1为先手必胜,0为先手必败,空格为D的情况
/*
题目描述:棋盘上位于(1,1)处有一枚棋子,这枚棋子可能是国际象棋中王、车、马、后当中的一种,两个人依次移动
棋子,率先到达(n,m)点的人就算赢,注意,棋子只能向右、向下、向右下移动,现给出棋子的种类,以及
n和m的值,先手必胜则输出B,先手必败输出G,先手既非必胜又非必败(即没人走到(n,m))则输出D
*/
#pragma warning(disable:4786)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<sstream>
#define LL long long
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps=1e-6;
const int maxn = 1e3 + 5 ;
int queen[maxn][maxn] ;
int qvis1[maxn] , qvis2[maxn] , qvis3[2 * maxn] ;
int drx[] = {-1 , -2} , dry[] = {-2 , -1} ;
struct node
{
int x , y ;
};
void Knight(int n , int m )
{
if(n < m) swap(n , m) ;
if( n == m && (n % 3) == 1 ) printf("G\n");
else if( n % 3 == 0 && m == n - 1) printf("B\n");
else printf("D\n");
}
void King(int n , int m)
{
int cur = 0;
if( (m - 1) % 2 == 0 ){
if( (n - 1) % 2 == 1){
cur ^= 1;
}
}
else
cur ^= 1 ;
if(cur == 1) printf("B\n");
else printf("G\n") ;
}
void Rook(int n , int m)
{
if(n == m)
printf("G\n");
else
printf("B\n");
}
void Queen(int n , int m )
{
if(queen[1001 - n][1001 - m])
printf("B\n");
else
printf("G\n");
}
int main()
{
int T , type , n , m ;
scanf("%d",&T) ;
//皇后的问题比较复杂,先用数组表示出来
for(int i = 1000 ; i> 0 ; --i){ //逆序枚举
for(int j = 1000 ; j>0 ; --j){
if(!qvis1[i] && !qvis2[j] && !qvis3[i - j + 1000]){ //判重类似四皇后
queen[i][j] = 0;
qvis1[i] = qvis2[j] = qvis3[i - j + 1000] = 1 ;
}
else
queen[i][j] = 1 ;
}
}
while(T--){
scanf("%d %d %d",&type , &n , &m) ;
if( type == 1) King(n , m);
else if(type == 2) Rook(n , m) ;
else if(type == 3) Knight(n , m) ;
else Queen(n , m) ;
}
return 0;
}