Dasha and Chess
题解
开始看这道题时你会发现这道题数据给得非常奇怪,但可以先不管。
由于车走的都是最优策略,所以国王只有在行列上同时出现2个小兵时才能获胜。
于是乎我们需要构造出一种情形使得国王在一段长度为n的路途中同时面对n以上的小兵。
于是,我们又回到了数据上。一个很神奇的式子:。
而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;
}