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

猜你喜欢

转载自www.cnblogs.com/Forever-666/p/11235148.html