• 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 }
  • 相关阅读:
    多叉树
    PowerDesigner设置集锦(2)
    Delphi应用程序在命令行下带参数执行返回命令行提示的问题
    不允许在 '*******' 上使用扩展属性,或对象不存在
    仓库管理系统开发完成
    动态创建Frame窗体(根据类名,除T以外的字母)
    Access中的常用TSQL
    批量删除同类文件(带通配符)
    判断Access数据库中的表或查询是否存在的SQL
    序列化FastReport,重要提示少走弯路
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10267924.html
Copyright © 2020-2023  润新知