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 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...
随机推荐
- ldap 集成harbor
harbor: 1.6 默认配置文件在harbor.cfg,我们可以先不添加配置,直接在harbor web界面进行配置(harbor 1.6 如果db 启动失败提示postgresql 数据目录已存 ...
- AJAX跨域问题以及解决思路(更新中)
跨域的三大原因(同时满足) 浏览器限制 跨域 XHR请求 解决思路: 让浏览器不做限制,指定参数,让浏览器不做校验,但该方法不太合理,它需要每个人都去做改动. 不要发出XHR请求,这样就算是跨域,浏览 ...
- rest_framework视图和组件
一.视图 1.基本视图 #基本视图 #抽取基类 from rest_framework.response import Response from rest_framework.views impor ...
- 获取Tomcat更详细的日志
前言 有时候tomcat报错未详细,未能定位到原因. 解决方法: 获取更详细的日志,以便调试. 详细步骤: 获取详细的日志,方法如下: 在WEB-INF/classes目录下logging.pro ...
- Qt基础学习---滑动条之QSlider
Qt滑动条基本用法: //mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QLineEd ...
- asp.net mvc session锁问题
一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...
- yansir的原生js库
var yansir = { //isInteger为true返回的是四舍五入后的整数 num:function(min,max,isInteger){ if(isInteger){ return M ...
- Ubuntu 停止 mydesktop 服务
systemctl list-unit-files | grep mydesktop systemctl disable mydesktop.service
- 每天跟着书敲Mysql
要深入学下Mysql操作啦 CRUD,create,retrieve,update,delete
- python学习(十)