codeforces 1100 D Dasha and Chess

白:八连通一次一格;
黑:瞬间移动
要求任意棋子移动不能移动到有棋子的格子上
要求白走到黑的同行或者同列,白胜
我们扮演白,黑不会瞬间移动到我们的同行同列上

棋盘: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值