CF1100D Dasha and Chess

构造

考虑对于国王的坐标,可以将棋盘分成左上,左下,右上,右下四个区域

统计出来这些区域的黑车数量

如果向某一个方向走,那么除其方向反向的区域的黑车不用动以外,其他都要动

比如向右上走,那么除了左下的区域,其他的区域的黑车都要动

那么对于一个国王坐标,走到棋盘四个角中的一个角的步数,小于需要移动黑车的数量

那么在这个坐标是一个必胜点(奇异状态)

那么将国王先移动到棋盘的中点

因为666可以分为166,166,167,167

166+167+167=500

而国王走到一个端点的步数为499

500>499

那么必胜

#include <bits/stdc++.h>
using namespace std;
const int n=666;
int kx,ky,tx,ty,vi[1100][1100];
int dx[5],dy[5],tot;
struct node
{
    int x,y;
}sh[1000];
struct dir
{
    int num,wh;
}a[6];
bool cmp(dir a,dir b)
{
    return (a.num<b.num);
}
bool run()
{
    tot++;
    if (vi[kx+tx][ky+ty])
    {
        printf("%d %d
",kx+tx,ky);
        fflush(stdout);
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        return 1;
    }
    printf("%d %d
",kx+tx,ky+ty);
    kx+=tx;ky+=ty;
    fflush(stdout);
    int k,x,y;
    scanf("%d%d%d",&k,&x,&y);
    if (k==-1)
      return 1;
    vi[sh[k].x][sh[k].y]--;
    sh[k].x=x;
    sh[k].y=y;
    vi[sh[k].x][sh[k].y]++;
    return 0;
}
int main()
{
    scanf("%d%d",&kx,&ky);
    for (int i=1;i<=n;i++)
      scanf("%d%d",&sh[i].x,&sh[i].y);
    for (int i=1;i<=n;i++)
      vi[sh[i].x][sh[i].y]++;//注意有可能多个在一起
    if (kx<500)
      tx=1;
    if (kx>500)
      tx=-1;
    if (ky<500)
      ty=1;
    if (ky>500)
      ty=-1;
    while (1)
    {
        if (kx==500 || ky==500)
          break;
        if (run())
          return 0;
    }
    if (kx==500 && ky!=500)
    {
        tx=0;
        if (ky>500)
          ty=-1;
        else
          ty=1;
    }
    if (kx!=500 && ky==500)
    {
        ty=0;
        if (kx<500)
          tx=1;
        else
          tx=-1;
    }
    while (1)
    {
        if (kx==500 && ky==500)
          break;
        if (run())
          return 0;
    }
    for (int i=1;i<=499;i++)
    {
        for (int j=1;j<=499;j++)
        {
            if (vi[i][j])
            {
                a[1].num+=vi[i][j];//left up
                a[1].wh=1;
            }
        }
    }
    for (int i=1;i<=499;i++)
    {
        for (int j=501;j<=999;j++)
        {
            if (vi[i][j])
            {
                a[2].num+=vi[i][j];//right up
                a[2].wh=2;
            }
        }
    }
    for (int i=501;i<=999;i++)
    {
        for (int j=501;j<=999;j++)
        {
            if (vi[i][j])
            {
                a[3].num+=vi[i][j];//right down
                a[3].wh=3;
            }
        }
    }
    for (int i=501;i<=999;i++)
    {
        for (int j=1;j<=499;j++)
        {
            if (vi[i][j])
            {
                a[4].num+=vi[i][j];//left down
                a[4].wh=4;
            }
        }
    }
    for (int i=1;i<=4;i++)
      a[i].wh=i;
    dx[1]=1;dx[2]=1;dx[3]=-1;dx[4]=-1;
    dy[1]=1;dy[2]=-1;dy[3]=-1;dy[4]=1;
    sort(a+1,a+1+4,cmp);
    tx=dx[a[1].wh];
    ty=dy[a[1].wh];
    while (1)
    {
        if (run())
          return 0;
        if (kx==1 || kx==999 || ky==0 || ky==999)
          break;
    }
    tx=-tx;ty=-ty;
    while (tot<=2000)
    {
        if (run())
          return 0;
        if (kx==1 || kx==999 || ky==0 || ky==999)
          break;
    }
}
原文地址:https://www.cnblogs.com/huangchenyan/p/11230368.html