白:八连通一次一格;
黑:瞬间移动
要求任意棋子移动不能移动到有棋子的格子上
要求白走到黑的同行或者同列,白胜
我们扮演白,黑不会瞬间移动到我们的同行同列上
棋盘:999*999
黑666个
666/4=166…2;
所以平均下来将棋盘平均分四块
在平均分的这种最差的情况下
其中三块黑棋数量和最多有167+167+166=500;
所以先将白走到500,500也就是棋盘中央
然后往黑旗数量最少的那块的反对角线走即可必胜.
自己画画图,将黑的同行同列画出就是有点像扫描线一样扫.
其实是扫四分之三的区域
(第一次做交互题额)
代码很好理解如下
先自己写,这题代码难度还是很小的
#include<bits/stdc++.h>
using namespace std;typedef long long ll;typedef pair<int,int>pii;
#define fi first
#define sc second
#define sz(a) ((int)(a).size())
#define f(i,a,b) for(int i=a;i<b;++i)
#define ff(i,a,b) for(int i=a;i<=b;++i)
#define file freopen("in.txt","r",stdin)
#define mem(a,b) memset(a,b,sizeof(a))
/*********************************************/
const int N=1e3+5;
const int m=500;
int x,y,xx[N],yy[N],x2,y2,now,tox,toy;
int mp[N][N];
struct node {
int num;
int w;
}hh[4];
bool cmp(node a,node b) {return a.num<b.num;}
void tosw(int x1,int y1) {
while(x!=x1||y!=y1) {
if(y<y1) y++;else y--;
if(x<x1&&mp[x+1][y]==0) x++;
else if(x>x1&&mp[x-1][y]==0) x--;
cout << x << ' ' << y << endl;
cin >> now >> x2 >> y2;
if(now<0) exit(0);
mp[xx[now]][yy[now]]=0;
xx[now]=x2;yy[now]=y2;
mp[x2][y2]=1;
}
}
int main() {
cin >> x >> y;
ff(i,1,666) {cin >> xx[i] >> yy[i];mp[xx[i]][yy[i]]=1;}
tosw(m,m);
ff(i,0,3) hh[i].w=i;
ff(i,1,999) ff(j,1,999) if(mp[i][j]) {
if(i<m&&j<m) hh[0].num++;
else if(i<m&&j>m) hh[1].num++;
else if(i>m&&j<m) hh[2].num++;
else hh[3].num++;
}
sort(hh,hh+4,cmp);
int minn=hh[0].w;
if(minn==0) {tox=999;toy=999;}
else if(minn==1) {tox=999;toy=1;}
else if(minn==2) {tox=1;toy=999;}
else {tox=1;toy=1;};
tosw(tox,toy);
return 0;
}