2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667K

题目链接:https://codeforces.com/gym/101667/attachments

题意:现在让你从原点开始走,每次给你转向的方向你需要安排每一次转向要走多远并且让整个路径没有交点。

解题心得:螺旋走位法,记录上下左右能够到达的最远值,如果再次走该方向只需要比这个方向最远值多走一步就行了,这样不会有交点。



#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;

struct Step {
    int len, dir;
}step[maxn];

int n;

void init() {
    scanf("%d", &n);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&step[i].len, &step[i].dir);
    }
}

int main() {
//    freopen("1.in.txt", "r", stdin);
    init();
    int MaxX, MinX, MaxY, MinY, nowx, nowy;
    MaxX = MaxY = MinX = MinY = nowx = nowy = 0;

    int states = 0;

    vector <int> ans;
    for(int i=1;i<=n;i++) {
        int cnt = 0;
        if(states == 0) {
            cnt = MaxX - nowx + 1;
            nowx += cnt;
            MaxX = nowx;
        } else if(states == 3) {
            cnt = nowy - MinY + 1;
            nowy -= cnt;
            MinY = nowy;
        } else if(states == 2) {
            cnt = nowx - MinX + 1;
            nowx -= cnt;
            MinX = nowx;
        } else {
            cnt = MaxY - nowy + 1;
            nowy += cnt;
            MaxY = nowy;
        }
        ans.push_back(cnt);
        states = (states + step[i].dir + 4) % 4;
    }

    for(auto x:ans) {
        printf("%d\n", x);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值