对于king:我是套了一个表。
如果起点是P的话,则是后手赢,否则前手赢。
车:也是画图推出来的。
马:也是推出来的,情况如图咯。
对于后:比赛时竟然推错了。QAQ最后看了题解:是个威佐夫博奕。(2,3),(4,6),(5,8)……(ak,ak+k),ak是当前没有出现过的最小正整数。k就是两个坐标的差值,从1,2,3,4……
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int ty,n,m; int vis[1005]; void bo1() { if(n%2==0||m%2==0) { printf("B "); } else { printf("G "); } } void bo2() { if(n==m) { printf("G "); } else { printf("B "); } } void bo3() { if(n%3==1&&m%3==1&&n==m) { printf("G "); } else if(n%3==0&&m==n-1) { printf("B "); } else if(m%3==0&&n==m-1) { printf("B "); } else { printf("D "); } } void bo4() { memset(vis,0,sizeof(vis)); int maxn = max(n,m); int cnt = 1; int flag = 0; for(int i=2;i<=maxn;i++) { if(vis[i]) continue; //当前没访问过的最小正整数 int j = i+cnt; cnt++; vis[i] = vis[j] = 1; if(i==min(n,m)&&j==max(n,m)) flag = 1; } if(flag) printf("G "); else printf("B "); } int main() { int t; cin>>t; while(t--) { scanf("%d %d %d",&ty,&n,&m); switch(ty) { case 1: bo1(); break; case 2: bo2(); break; case 3: bo3(); break; case 4: bo4(); break; } } return 0; }