zoukankan      html  css  js  c++  java
  • Gym

    pro:给定R条街道,现在小孩在某条街上骑车车,最开始他沿着所在街道向东(1,4象限的方向)驶去,如果他遇到街道的交叉口,他会右转。问他转N次后在哪个街道。有特殊情况是他一只遇不到交叉口,会沿着街道一只走下去,这个时候如果不够N,就直接输出当前街道。 

    sol:(其实算是模拟题,假装是半平面交)。思路很好想,但是要AC还是有坑要de的。

    1,先找到起点所在街道,然后定向。

    2,每次求离当前点最近的且同向的交点,然后走到所在直线上,且需要定向。

    如果形成了一个环,那么N%循环节即可。

    坑:有可能有有相互垂直的两个街道,写法不完美的情况下,可能会一直在这个死字路口转圈(WA17)。

    解决方案是,每次走一条街的时候,手动向前走一点;或者每次求出一个交点,要排除交点和出发点相同的情况。

    #include<bits/stdc++.h>
    #define ll long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    const int maxn=200010;
    const double eps=1e-8;
    struct point{
        double x,y;
        point(){}
        point(double xx,double yy):x(xx),y(yy){}
    };
    struct line{
        point s,t;
        point p;
        line(){}
        line(point ss,point pp):s(ss),p(pp){}
    };
    double det(point a,point b){ return a.x*b.y-a.y*b.x; }
    double dot(point a,point b){ return a.x*b.x+a.y*b.y; }
    point operator *(point a,double x){ return point(a.x*x,a.y*x);}
    point operator +(point a,point b){ return point(a.x+b.x,a.y+b.y);}
    point operator -(point a,point b){ return point(a.x-b.x,a.y-b.y);}
    line road[maxn]; string name[maxn];
    ll N;int R,Now; point S; line st;
    point llintersect(line a,line b)
    {
        point w=a.s-b.s;
        double t=det(b.p,w)/det(a.p,b.p);
        return a.s+a.p*t;
    }
    bool Online(point p,line L)
    {
        return fabs(det(p-L.t,p-L.s))<eps;
    }
    bool parl(point p,point q){
        return fabs(det(p,q))<eps;
    }
    void Change(int i)
    {
        swap(road[i].s,road[i].t); road[i].p=road[i].t-road[i].s;
    }
    void find()
    {
        rep(i,1,R){
            if(Online(S,road[i])) {
                if(dot(point(1,0),road[i].p)<eps) Change(i);
                st=road[i];
                Now=i; return ;
            }
        }
    }
    int tot,h[maxn],vis[maxn]; point p[maxn];
    int main()
    {
        scanf("%d%lld%lf%lf",&R,&N,&S.x,&S.y);
        rep(i,1,R) {
            cin>>name[i];
            scanf("%lf%lf%lf%lf",&road[i].s.x,&road[i].s.y,&road[i].t.x,&road[i].t.y);
            road[i].p=road[i].t-road[i].s;
        }
        if(R==1||N==0){
            cout<<name[1]<<endl;
            return 0;
        }
        int C=0;
        find(); h[0]=Now; vis[Now]=1; p[0]=S;
        while(1){
            int t=0; point tp;
            rep(i,1,R){
                if(i==Now) continue;
                if(parl(st.p,road[i].p)) continue;
                point o=llintersect(st,road[i]);
                if(dot(o-p[tot],st.p)<=eps) continue;
                if(fabs(o.x-p[tot].x)+fabs(o.y-p[tot].y)<=eps) continue;
                if(det(st.p,road[i].p)>eps) Change(i);
                if(t==0||dot(o-p[tot],o-p[tot])<dot(tp-p[tot],tp-p[tot])){
                    t=i; tp=o;
                }
            }
            if(t==0||tot==N){
                cout<<name[Now]<<endl;
                return 0;
            }
            Now=t; st=road[t]; h[++tot]=t; p[tot]=tp;//+st.p*eps;
            if(vis[Now]) { break;} vis[Now]=1;
            if(tot==N){
                cout<<name[Now]<<endl;
                return 0;
            }
        }
        cout<<name[h[N%tot]]<<endl;
        return 0;
    }
  • 相关阅读:
    React Native组件之Text
    React Native的组件ListView
    React Native中的网络请求fetch和简单封装
    解决FileUpload上传大文件报错
    以EF形式操作mysql数据库
    以ADO形式操作mysql数据库
    Docker
    Docker创建镜像文件并在容器中运行
    WIN10下的Docker安装
    MySQL安装
  • 原文地址:https://www.cnblogs.com/hua-dong/p/10701687.html
Copyright © 2011-2022 走看看