D. Dasha and Chess(交互题)

题目链接: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 ")的话,我们需要在这个地方的下面再加一句fflush(stdout),这是为了清除缓存区的,还有一种方法可以避免这个的出现,就是直接用cout<<x<<" "<<y<<endl;endl能自动刷新缓存区,不需要再手动清除,因为说到底。" ",就只是个换行。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <ctime>
 7 #include <algorithm>
 8 #include <map>
 9 #include <vector>
10 #include <queue>
11 using namespace std;
12 # define ll long long
13 # define pi acos(-1.0)
14 const int maxn  = 1000+100;
15 int xx[maxn],yy[maxn];
16 int Map[maxn][maxn];
17 int q[10];
18 void cal(int t1,int t2,int x,int y)
19 {
20     while(x!=t1||y!=t2)
21     {
22         if(y<t2)
23             y++;
24         else
25             y--;
26         if(x<t1&&Map[x+1][y]==0)
27         {
28             x++,Map[x][y]=1;
29         }
30         else if(x>t1&&Map[x-1][y]==0)
31         {
32             x--,Map[x][y]=1;
33         }
34         int num,x1,y1;
35         cout<<x<<" "<<y<<endl;
36 //        printf("%d %d
",x,y);
37 //        fflush(stdout);
38         scanf("%d %d %d",&num,&x1,&y1);
39         if(num==-1)
40           return ;
41         Map[xx[num]][yy[num]]=0;
42         xx[num]=x1,yy[num]=y1;
43         Map[x1][y1]=1;
44     }
45 }
46 int main()
47 {
48     int x,y;
49     scanf("%d %d",&x,&y);
50     for(int i=1; i<=666; i++)
51     {
52         scanf("%d %d",&xx[i],&yy[i]);
53         Map[xx[i]][yy[i]]=1;
54     }
55     cal(500,500,x,y);
56     for(int i=1; i<=999; i++)
57     {
58         for(int j=1; j<=999; j++)
59         {
60             if(Map[i][j]==0)
61                 continue;
62             if(i<=499&&j<=499)
63                 q[1]++;
64             else if(i<=499&&j>=500)
65                 q[2]++;
66             else if(i>=500&&j<=499)
67                 q[3]++;
68             else
69                 q[4]++;
70         }
71     }
72     int maxx=min(q[1],min(min(q[2],q[3]),q[4]));
73     if(maxx==q[1])
74     {
75         cal(999,999,500,500);
76     }
77     else if(maxx==q[2])
78     {
79         cal(999,1,500,500);
80     }
81     else if(maxx==q[3])
82     {
83         cal(1,999,500,500);
84     }
85     else
86         cal(1,1,500,500);
87     return 0;
88 }
原文地址:https://www.cnblogs.com/letlifestop/p/10267924.html