使用判断 x,y 方向上是否能走一步的代码WA on7,8,9
查看原帖
使用判断 x,y 方向上是否能走一步的代码WA on7,8,9
667448
go_deeper楼主2024/11/7 00:16

使用的方法是通过两个向量叠加看在某个方向上是否能只走一步,最后答案错误,无解输出成有解。

void solve(){
    int n;
    cin>>n;
    vector<array<int,2>>a(n);
    for(auto&[x,y]:a)cin>>x>>y;
    //马在x,y方向上走
    int sx=0,sy=0,gx=0,gy=0;
    for(auto[x,y]:a)
    {
        if(x==0)
        {
            if(y<0)sy|=1;
            else if(y>0)sy|=2;
            gy=gcd(gy,abs(y));
        }
        else if(y==0)
        {
            if(x<0)sx|=1;
            else if(x>0)sx|=2;
            gx=gcd(gx,abs(x));
        }
    }
    for(auto[x,y]:a)
    {
        for(auto[xx,yy]:a)
        {
            if(xx&&x)
            {
                int a=lcm(abs(xx),abs(x))/abs(xx),b=lcm(abs(xx),abs(x))/abs(x);
                if((xx>0)==(x>0))b=-b;
                int ny=a*yy+b*y;
                if(ny<0)sy|=1;
                else if(ny>0)sy|=2;
                gy=gcd(gy,ny);
            }
            if(yy&&y)
            {
                int a=lcm(abs(yy),abs(y))/abs(yy),b=lcm(abs(yy),abs(y))/abs(y);
                if((yy>0)==(y>0))b=-b;
                int nx=a*xx+b*x;
                if(nx<0)sx|=1;
                else if(nx>0)sx|=2;
                gx=gcd(gx,nx);
            }
        }
    }
    writeln(sx==3&&sy==3&&gx==1&&gy==1?"TAK":"NIE");
}
2024/11/7 00:16
加载中...