题解:P9957 [USACO20DEC] Stuck in a Rut B

· · 题解

P9957 [USACO20DEC] Stuck in a Rut B

题意归纳:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define _ read<int>()
template <class T>inline T read()
{
    T r=0,f=1;char c=getchar();
    while(!isdigit(c))
    {
        if(c=='-') f=-1;c=getchar();
    }
    while(isdigit(c)) r=(r<<1)+(r<<3)+(c^48),c=getchar();
    return f*r;
}
inline void out(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x<10) putchar(x+'0');
    else out(x/10),putchar(x%10+'0');
}
int inf=2e9;
struct fish
{
    long long id, x, y, z, d;//x,y是初始位置,d是走的方格数量 
    char fx;//方向 
}a[100];
int n; 
bool cmp1(fish m, fish n)//按行列坐标之和进行排序排序
{
    return m.z > n.z;
}
bool cmp2(fish m, fish n)//把顺序调整回输入时候的顺序 
{
    return m.id < n.id; 
}
signed main()
{
    n=_;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        char c;
        cin>>c;//每头牛所在的x和y坐标不同 
        x=_,y=_;
        a[i]={i,x,y,x+y,inf,c};//无穷大 
    }
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;i++)//遍历每一头牛 
    {
        for(int j=1;j<i;j++)//只有前面的点才有可能阻拦第i头牛
        {
            if(a[j].z == a[i].z || a[j].fx == a[i].fx) continue;//同一条斜线或者同一个方向的牛,肯定拦不住 
            if(a[i].fx == 'E' && a[j].fx == 'N')//i为向右的,j向上,然后找出最快拦住这条牛的步数 
            {
                if(a[i].y < a[j].y) continue;//i在j的下方,肯定拦不住 
                if(a[j].y+a[j].d > a[i].y) a[i].d = min(a[i].d, a[j].x-a[i].x);//j所在y加上移动步数如果大于i所在y,可以拦截 
            }
            else//i为向上,j为向右 
            {
                if(a[i].x < a[j].x) continue;//i在j的左方,肯定拦不住 
                if(a[j].x+a[j].d > a[i].x) a[i].d = min(a[i].d, a[j].y-a[i].y);//j所在x加上移动步数如果大于i所在x,可以拦截 
            }
        } 
    }
    sort(a+1,a+n+1,cmp2); 
    for(int i=1;i<=n;i++)
    {
        if(a[i].d==inf) puts("Infinity");
        else 
        {
            out(a[i].d);
            putchar('\n');
        }
    }
    return 0;
}