codeforces 1100D-Dasha and Chess

Posted forever-666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1100D-Dasha and Chess相关的知识,希望对你有一定的参考价值。

传送门:QAQQAQ

 

题意:This is an interactive task.

999*999国际象棋棋盘中有一个王和666个车,玩家走王,电脑走车,玩家先走,玩家的目的是让对方的车将到自己的王,电脑的车可以“飞”(即移动到棋盘上任意一点),但吃子规则不变,玩家必须要在2000步之内获胜

 

思路:哇塞这是国际象棋!好激动好激动!(然而没做出来)

我们考虑一般情况:根据王的位置一横一竖把棋盘分成4个部分,加入王往一个方向走(这里假设往左上走),则除了背对他的方向其它所有车都要闪开(即左上,右上,左下)

假如我们从左上角开始赶车:有666个车要被赶走,王走到右下角(即把车赶光)要998步,太多了;

那么如果王在最中间呢?——最少的一个方向最多也就166个,也就是王在中间背对车个数最少的方向走最少也可以赶走500个车,而王走到最底下只要499步——有2个车来不及闪开了

所以我们先把王移到正中间,再背对车个数最少的方向逼近就行了

 

活生生打成了码农题(200多行,有很多函数是多余的),一直说越界(其实电脑骗人,只要wronganswer就说越界),加了很多特判,结果发现把王的位置也读入的时候mp赋值为1了

代码:

技术图片
#include<bits/stdc++.h>
using namespace std;
const int inf=200000000;
int dx[]=-1,-1,1,1;
int dy[]=-1,1,-1,1;
 
struct node
    int x,y;
a[667];
int mp[1020][1020];
 
void init()

    memset(mp,0,sizeof(mp));
    for(int i=0;i<=666;i++) 
    
        scanf("%d%d",&a[i].x,&a[i].y);
        if (i) mp[a[i].x][a[i].y]++;//之前没判i!=0
    

 
void print()

    printf("%d %d\n",a[0].x,a[0].y);
    fflush(stdout);

 
void up()

    a[0].x--;
    print();

 
void down()

    a[0].x++;
    print();

 
void left()

    a[0].y--;
    print();

 
void right()

    a[0].y++;
    print();
 
 
void leftup()

    if(mp[a[0].x-1][a[0].y-1]) 
    
        up();
        return;
    
    a[0].x--; a[0].y--;
    print();

 
void leftdown()

    if(mp[a[0].x+1][a[0].y-1]) 
    
        down();
        return;
    
    a[0].x++; a[0].y--;
    print();

 
void rightdown()

    if(mp[a[0].x+1][a[0].y+1]) 
    
        down();
        return;
    
    a[0].x++; a[0].y++;
    print();

 
void rightup() 

    if(mp[a[0].x-1][a[0].y+1]) 
    
        up();
        return;
    
    a[0].x--; a[0].y++;
    print();

 
void read()

    int id,xx,yy;
    scanf("%d%d%d",&id,&xx,&yy);
    if(id==-1) 
    
        exit(0);
    
    mp[a[id].x][a[id].y]--;
    a[id].x=xx; a[id].y=yy;
    mp[a[id].x][a[id].y]++;

 
void ready()

    while(a[0].x<500)
    
        down();
        read();
    
    while(a[0].x>500)
    
        up();
        read();
    
    while(a[0].y>500)
    
        left();
        read();
    
    while(a[0].y<500)
    
        right();
        read();
    

 
int dir,minn=inf,tmp;
void judge_direction()

    int cnt[4]=0,0,0,0;//0:leftup 1:rightup 2:leftdown 3:rightdown
    for(int i=1;i<=999;i++)
    
        for(int j=1;j<=999;j++)
        
            if(i<500)
            
                if(j<500) cnt[0]+=mp[i][j];
                if(j>500) cnt[1]+=mp[i][j];
             
            if(i>500)
            
                if(j<500) cnt[2]+=mp[i][j];
                if(j>500) cnt[3]+=mp[i][j];
            
        
    
    for(int i=0;i<4;i++)
    
        if(minn>cnt[i]) minn=cnt[i],tmp=i;
    
    dir=3-tmp;

 
void move(int dir)

    if(dir==0) leftup();
    else if(dir==1) rightup();
    else if(dir==2) leftdown();
    else rightdown();

 
void solve()

    while(1)
    
        move(dir);
        read();
    

 
int main()

    init();
    ready();
    judge_direction();
    solve();
    return 0;
View Code

 

以上是关于codeforces 1100D-Dasha and Chess的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 1100F Ivan and Burgers

Codeforces 1100F(线性基+贪心)

Roman and Browser-罗曼的浏览器 CodeForce1100A 暴力

CodeForces - 1100E 二分+拓扑排序

CodeForces - 1100E 二分+拓扑排序

Codeforces1100F. Ivan and Burgers(离线+线性基)