hdu 5754 Life Winner Bo 博弈论

对于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\n");
    }
    else
    {
        printf("G\n");
    }
}
void bo2()
{
    if(n==m)
    {
        printf("G\n");
    }
    else
    {
        printf("B\n");
    }
}
void bo3()
{
    if(n%3==1&&m%3==1&&n==m)
    {
        printf("G\n");
    }
    else if(n%3==0&&m==n-1)
    {
        printf("B\n");
    }
    else if(m%3==0&&n==m-1)
    {
        printf("B\n");
    }
    else
    {
        printf("D\n");
    }
}
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\n");
  else printf("B\n");
}
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;
}
卷珠帘

 

posted @ 2016-07-27 00:01  卷珠帘  阅读(296)  评论(0编辑  收藏  举报