[CF1100D]Dasha and Chess

Dasha and Chess

题解

开始看这道题时你会发现这道题数据给得非常奇怪,但可以先不管。

由于车走的都是最优策略,所以国王只有在行列上同时出现2个小兵时才能获胜。

于是乎我们需要构造出一种情形使得国王在一段长度为n的路途中同时面对n以上的小兵。

于是,我们又回到了数据上。一个很神奇的式子:666\times \frac{3}{4}= 499.5

而499正是从中点走到图的一个顶点的距离。

所以将图平均分成4部分后,当国王在中点时肯定会有三部分的和大于499,于是我们就可以先走到中点,再从中点沿最多的一快块走到端点,即可保证一定可以获得胜利。

源码

注意有人的格子不能走呀。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL;
struct ming{
	int x,y;
	ming(){}
	ming(int X,int Y){x=X;y=Y;}
}king,car[700];
int sum[5];
bool vis[1005][1005];
void solve(int dx,int dy){
	king.x+=dx;king.y+=dy;
	if(vis[king.x][king.y])king.x-=dx;
	printf("%d %d\n",king.x,king.y);
	fflush(stdout);int k,x,y;
	scanf("%d %d %d",&k,&x,&y);
	if(k==-1&&x==-1&&y==-1)exit(0);
	vis[car[k].x][car[k].y]=0;
	car[k].x=x;car[k].y=y;vis[x][y]=1;
}
signed main(){
	cin>>king.x>>king.y;
	for(int i=1;i<=666;i++)cin>>car[i].x>>car[i].y,vis[car[i].x][car[i].y]=1;
	while(king.x>500)solve(-1,0);
	while(king.x<500)solve(1,0);
	while(king.y>500)solve(0,-1);
	while(king.y<500)solve(0,1);
	for(int i=1;i<=666;i++)sum[(car[i].x<500)*2+(car[i].y<500)]++;
	int minn,pnt;
	for(int i=0;i<4;i++)if(minn>sum[i])minn=sum[i],pnt=i;
	while(1)solve(pnt/2?1:-1,pnt%2?1:-1);
	return 0;
}

谢谢!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值