Gym - 101490F:Endless Turning (几何模拟)

题目链接:http://codeforces.com/gym/101490/attachments

SOLUTION:

其实就是一个模拟,但是难点是如何操作

 

CODE:

 

 

#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)<=0) continue;//反向

            if(fabs(o.x-p[tot].x)<=eps&&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;
}

 

  

 

转载于:https://www.cnblogs.com/zhangbuang/p/11384208.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值