[USACO Dec20 Bronze]Stuck in a Rut

Farmer John 最近扩大了他的农场,从奶牛们的角度看来这个农场相当于是无限大了!奶牛们将农场上放牧的区域想作是一个由正方形方格组成的无限大二维方阵,每个方格中均有美味的草(将每个方格看作是棋盘上的一个方格)。Farmer John 的 N 头奶牛(1≤N≤50)初始时位于不同的方格中,一部分朝向北面,一部分朝向东面。

每一小时,每头奶牛会执行以下二者之一:

  • 如果她当前所在的方格里的草已经被其他奶牛吃掉了,则她会停下。
  • 吃完她当前所在的方格中的所有草,并向她朝向的方向移动一个方格。

经过一段时间,每头奶牛的身后会留下一条被啃秃了的轨迹。

如果两头奶牛在一次移动中移动到了同一个有草的方格,她们会分享这个方格中的草,并在下一个小时继续沿她们朝向的方向移动。

请求出每头奶牛吃到的草的数量。有些奶牛永远不会停下,从而吃到无限多的草。

输入格式(从终端/标准输入读入)

输入的第一行包含 N。以下 N 行,每行描述一头奶牛的起始位置,包含一个字符 N(表示朝向北面) 或 E(表示朝向东面),以及两个非负整数 x 和 y(0 \le x \le 10^90≤x≤109,0 \le y \le 10^90≤y≤109)表示方格的坐标。所有 x 坐标各不相同,所有 y 坐标各不相同。

为了使方向和坐标尽可能明确,如果一头奶牛位于方格 (x,y) 并向北移动,她会到达方格 (x,y+1)。如果她向东移动,她会到达方格 (x+1,y)。

输出格式(输出至终端/标准输出)

输出 N 行。输出的第 i 行包含输入中的第 i 头奶牛吃到草的方格的数量。如果一头奶牛可以吃到无限多的草,为这头奶牛输出 "Infinity"。

测试点性质

测试点 2-5 中,所有坐标不超过 100。

测试点 6-10 没有额外限制。

样例输入

6
E 3 5
N 5 3
E 4 6
E 10 4
N 11 2
N 8 1

样例输出

5
3
Infinity
Infinity
2
5
#include <bits/stdc++.h>
using namespace std;
int N, cnt;
struct Cow{
    char dir;
    int x, y, stop_x, stop_y, id;
    bool stopped;
}cow[60];
bool cmpCoor(Cow a, Cow b){
    if(a.dir == 'E' && b.dir == 'E'){
        return a.y < b.y;
    }else if(a.dir == 'N' && b.dir == 'N'){
        return a.x < b.x;
    }else{
        return a.dir < b.dir;
    }
}
bool cmpId(Cow a, Cow b){
    return a.id < b.id;
}
int main(){
    cin >> N;
    for(int i = 1; i <= N; i++){
        cin >> cow[i].dir >> cow[i].x >> cow[i].y;
        cow[i].id = i;
        cow[i].stopped = false;
        if(cow[i].dir == 'E'){
            cnt++;
        }
    }
    sort(cow + 1, cow + 1 + N, cmpCoor);
    for(int i = 1; i <= cnt; i++){
        for(int j = cnt + 1; j <= N; j++){
            if(cow[j].stopped || cow[j].y > cow[i].y || cow[j].x < cow[i].x){
                continue;
            }
            if(cow[i].y - cow[j].y < cow[j].x - cow[i].x){
                cow[i].stopped = true;
                cow[i].stop_x = cow[j].x;
                cow[i].stop_y = cow[i].y;
                break;
            }
            if(cow[i].y - cow[j].y > cow[j].x - cow[i].x){
                cow[j].stopped = true;
                cow[j].stop_x = cow[j].x;
                cow[j].stop_y = cow[i].y;
            }
        }
    }
    sort(cow + 1, cow + 1 + N, cmpId);
    for(int i = 1; i <= N; i++){
        if(!cow[i].stopped){
            cout << "Infinity" << endl;
        }else{
            if(cow[i].dir == 'E'){
                cout << cow[i].stop_x - cow[i].x << endl;
            }else{
                cout << cow[i].stop_y - cow[i].y << endl;
            }
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值