D. Dasha and Chess(交互题)

时间:2022-09-28 19:32:08

题目链接:http://codeforces.com/contest/1100/problem/D

题目大意:给你一个999*999的图,然后有666个黑色旗子,一个白色棋子,每一次白色棋子只能在它附近的八个方位行进一步,而黑色棋子可以像象棋里面的车一样行走,然后首先输入白色棋子的方位,然后再给你666个黑色棋子的方位,你先走,然后黑色棋子再走,你走的每一步黑色棋子都能看见,然后问你怎么样才能胜利?胜利的条件是黑色棋子和白色棋子再同一行或者同一列。

具体思路:借鉴了别人的思路,我们可以首先让这个棋子回到(500,500)这个坐标,然后再看一下(1,499)*(1,499),(1,499)*(500,999),(500,999)*(1,499),(500,999)*(500,999)这四块区域中哪一块的的黑色棋子最少,那么我们就以起点(500,500)开始,到达最少的这块区域的对角的那块区域的角。因为我们需要使得白色有最大的可能性获胜,所以我们需要找到线最密集的地方。

注意:在输出的时候,如果是printf("%d %d\n")的话,我们需要在这个地方的下面再加一句fflush(stdout),这是为了清除缓存区的,还有一种方法可以避免这个的出现,就是直接用cout<<x<<" "<<y<<endl;endl能自动刷新缓存区,不需要再手动清除,因为说到底。"\n",就只是个换行。

AC代码:

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
# define ll long long
# define pi acos(-1.0)
const int maxn = +;
int xx[maxn],yy[maxn];
int Map[maxn][maxn];
int q[];
void cal(int t1,int t2,int x,int y)
{
while(x!=t1||y!=t2)
{
if(y<t2)
y++;
else
y--;
if(x<t1&&Map[x+][y]==)
{
x++,Map[x][y]=;
}
else if(x>t1&&Map[x-][y]==)
{
x--,Map[x][y]=;
}
int num,x1,y1;
cout<<x<<" "<<y<<endl;
// printf("%d %d\n",x,y);
// fflush(stdout);
scanf("%d %d %d",&num,&x1,&y1);
if(num==-)
return ;
Map[xx[num]][yy[num]]=;
xx[num]=x1,yy[num]=y1;
Map[x1][y1]=;
}
}
int main()
{
int x,y;
scanf("%d %d",&x,&y);
for(int i=; i<=; i++)
{
scanf("%d %d",&xx[i],&yy[i]);
Map[xx[i]][yy[i]]=;
}
cal(,,x,y);
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
if(Map[i][j]==)
continue;
if(i<=&&j<=)
q[]++;
else if(i<=&&j>=)
q[]++;
else if(i>=&&j<=)
q[]++;
else
q[]++;
}
}
int maxx=min(q[],min(min(q[],q[]),q[]));
if(maxx==q[])
{
cal(,,,);
}
else if(maxx==q[])
{
cal(,,,);
}
else if(maxx==q[])
{
cal(,,,);
}
else
cal(,,,);
return ;
}