题目链接: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 }