Gym - 101490F:Endless Turning (半平面交)
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=;
const double eps=1e-;
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,,R){
if(Online(S,road[i])) {
if(dot(point(,),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,,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==||N==){
cout<<name[]<<endl;
return ;
}
int C=;
find(); h[]=Now; vis[Now]=; p[]=S;
while(){
int t=; point tp;
rep(i,,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==||dot(o-p[tot],o-p[tot])<dot(tp-p[tot],tp-p[tot])){
t=i; tp=o;
}
}
if(t==||tot==N){
cout<<name[Now]<<endl;
return ;
}
Now=t; st=road[t]; h[++tot]=t; p[tot]=tp;//+st.p*eps;
if(vis[Now]) { break;} vis[Now]=;
if(tot==N){
cout<<name[Now]<<endl;
return ;
}
}
cout<<name[h[N%tot]]<<endl;
return ;
}
Gym - 101490F:Endless Turning (半平面交)的更多相关文章
- POJ 2451 Uyuw's Concert (半平面交)
题目链接:POJ 2451 Problem Description Prince Remmarguts solved the CHESS puzzle successfully. As an awar ...
- 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)
按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...
- 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 959 Solved: 489[Submit][Status] ...
- 【CSU1812】三角形和矩形 【半平面交】
检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...
- 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea
题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...
- poj 3335(半平面交)
链接:http://poj.org/problem?id=3335 //大牛们常说的测模板题 ------------------------------------------------- ...
- poj3525Most Distant Point from the Sea(半平面交)
链接 求凸多边形内一点距离边最远. 做法:二分+半平面交判定. 二分距离,每次让每条边向内推进d,用半平面交判定一下是否有核. 本想自己写一个向内推进..仔细一看发现自己的平面交模板上自带.. #in ...
- poj1474Video Surveillance(半平面交)
链接 半平面交的模板题,判断有没有核.: 注意一下最后的核可能为一条线,面积也是为0的,但却是有的. #include<iostream> #include <stdio.h> ...
- 半平面交模板(O(n*n)&& O(n*log(n))
摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...
随机推荐
- Java中static的用法解析
知识点1.static关键字a.可以修饰变量,方法,代码块b.修饰的变量和方法可以使用类名.变量名/类名.方法名调用c.static修饰的资源为静态资源,在类加载的时候执行d.在静态方法中只能调用静态 ...
- cpu使用率低负载高,原因分析
原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么 ...
- 剑指offer(24)二叉树中和为某一值的路径
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...
- 【问题解决:启动卡死】Eclipse启动卡死的解决办法
问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...
- AJAX缓存清理
Ajax页面缓存是ajax处理数据时对一些重复相同数据进行一个缓存操作,这样从另一个层面对于我们来讲是非常的不错了,但有时我们并不希望它缓存要如何处理呢?下面我们一起来看看关于页面缓存问题分析与解决, ...
- CSS--交互效果
动画过渡效果 //vue <div class="search-list" v-show="searches.length"> <transi ...
- 初始FreeMake
此文章是观看视频学习的,只是一点点基础还不太深 视频地址:http://www.icoolxue.com/play/5773 源码:码云:https://gitee.com/wmjGood/FreeM ...
- Cocos Creator学习四:按钮响应事件
1.方法一:通过编辑器对cc.Button的属性进行拖放操作进行控制 (1)创建脚本BtnClick1.js,增加btnClick1函数,然后拖放到Canvas节点中(记得拖放,否则下面步骤将找不到对 ...
- Angular4学习笔记(七)- ViewChild和ViewChildren
基础 ViewChild ViewChild 装饰器用于获取模板视图中的元素或直接调用其组件中的方法.它支持 Type 类型或 string 类型的选择器,同时支持设置 read 查询条件,以获取不同 ...
- PHP设计模式概念
设计模式(Design Pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案 设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案.面向对象 ...