构造
考虑对于国王的坐标,可以将棋盘分成左上,左下,右上,右下四个区域
统计出来这些区域的黑车数量
如果向某一个方向走,那么除其方向反向的区域的黑车不用动以外,其他都要动
比如向右上走,那么除了左下的区域,其他的区域的黑车都要动
那么对于一个国王坐标,走到棋盘四个角中的一个角的步数,小于需要移动黑车的数量
那么在这个坐标是一个必胜点(奇异状态)
那么将国王先移动到棋盘的中点
因为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; } }