poj 3304
我老人家要开始玩几何了!
。这个题有点自闭。
就是问是否存在一条直线经过所有了n条线段,(有交点).
我老人家愚昧不可救药,想了想决定先求出来 这两条直线的交点,然后看是否在线段上。但是一直写不对。。。
看了看题解发现可以直接用叉积,显然如果没有交点,那么线段在直线的一边,所以叉积就是正的,否则小于等于0.
#include <iostream>
#include <cmath>
#include <cstdio>
typedef double db;
const db eps=1e-;
const db pi = acos(-);
int sign(db k){
if (k>eps) return ; else if (k<-eps) return -; return ;
}
int cmp(db k1,db k2){return sign(k1-k2);}
struct point{
db x,y;
db abs(){return sqrt(x*x+y*y);}
db dis(point k1){return ((*this)-k1).abs();}
point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
point operator *(db k1)const {return (point){x*k1,y*k1};}
point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
point operator / (db k1) const{return (point){x/k1,y/k1};}
int operator == (const point &k1) const{return cmp(x,k1.x)==&&cmp(y,k1.y)==;}
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
struct Line{
point p[];
};
int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=;}
int inmid(point k1,point k2,point k3){//k3在[k1,k2]
return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);
}
point getLL (point k1,point k2,point k3,point k4){//两直线交点
db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3);
return (k1*w2+k2*w1)/(w1+w2);
}
bool onS(point k1,point k2,point q){//q在[k1,k2]
return inmid(k1,k2,q)&&sign(cross(k1-q,k2-k1))==;
}
int t,n;
Line l[];
bool slove(point s,point t){
if(sign(s.dis(t)==))return false;
for(int i=;i<=n;i++){
if(sign(cross(s-l[i].p[],t-l[i].p[])*sign(cross(s-l[i].p[],t-l[i].p[])))>)
return false;
}
return true;
}
int main(){
scanf("%d",&t);
while (t--){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&l[i].p[].x,&l[i].p[].y,&l[i].p[].x,&l[i].p[].y);
}
bool f=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(slove(l[i].p[],l[j].p[])){
f=;break;
}
else if(slove(l[i].p[],l[j].p[])){
f=;break;
}
else if(slove(l[i].p[],l[j].p[])){
f=;break;
}
else if(slove(l[i].p[],l[j].p[])){
f=;break; }
}if(f)break;
}
if(!f)
printf("No!\n");
else
printf("Yes!\n");
}
}
/**
1
3
0.0 0.0 0.0 1.0
0.0 2.0 0.0 3.0
1.0 1.0 2.0 1.0
*/
poj 3304的更多相关文章
- 判断线段和直线相交 POJ 3304
// 判断线段和直线相交 POJ 3304 // 思路: // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. #include <cstdio ...
- POJ 3304 Segments 基础线段交判断
LINK 题意:询问是否存在直线,使得所有线段在其上的投影拥有公共点 思路:如果投影拥有公共区域,那么从投影的公共区域作垂线,显然能够与所有线段相交,那么题目转换为询问是否存在直线与所有线段相交.判断 ...
- POJ 3304 Segments(计算几何:直线与线段相交)
POJ 3304 Segments 大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点. 思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes ...
- POJ 3304 Segments 判断直线和线段相交
POJ 3304 Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以 ...
- POJ 3304 Segments (判断直线与线段相交)
题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...
- POJ 3304 Segments(判断直线与线段是否相交)
题目传送门:POJ 3304 Segments Description Given n segments in the two dimensional space, write a program, ...
- poj 3304线段与直线相交
http://poj.org/problem?id=3304 Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...
- poj 3304 找一条直线穿过所有线段
题目链接:http://poj.org/problem?id=3304 #include<cstdio> #include<cstring> #include<cmath ...
- POJ 3304 Segments --枚举,几何
题意: 给n条线段,问有没有一条直线,是每条线段到这条直线上的投影有一个公共点. 解法: 有公共点说明有一条这条直线的垂线过所有线段,要找一条直线过所有线段,等价于从所有线段中任选两端点形成的直线存在 ...
- POJ 3304 Segments【叉积】
题意:有n条线段,问有没有一条直线使得所有线段在这条直线上的投影至少有一个共同点. 思路:逆向思维,很明显这个问题可以转化为是否有一条直线穿过所有线段,若有,问题要求的直线与该直线垂直,并且公共点为垂 ...
随机推荐
- 法嵌入互操作类型“SHDocVw.ShellWindowsClass”请改用适用的接口-解决方法
点DLL名字,---属性----------嵌入互操作类型(设置为false)
- ARMv8学习 —— SP_EL0和SP_ELx
在AArch64状态下,SP对应的物理寄存器有如下四个(某一时刻只能对应下面其中一个): SP_EL0和SP_EL1 SP_EL2 SP_EL3 如何使用呢? 1.如果程序运行在EL0,那么使用的是S ...
- Windows下NetBeans中文乱码解决办法
找到你的Netbeans安装目录下的etc文件夹,用记事本打开netbeans.conf,找到netbeans_default_options(不是最后那个带句号的…), 在其属性的最后(冒号以内)加 ...
- C# Task的GetAwaiter和ConfigureAwait
个人感觉Task 的GetAwaiter和ConfigureAwait也是比较好理解的,首先看看他们的实现 public class Task<TResult> : Task { //Ge ...
- git stash命令详解
git stash命令用于将更改储藏在脏工作目录中. 使用语法 git stash list [<options>] git stash show [<stash>] git ...
- Git上传空文件夹
git上传的文件夹为空的时候 1,先删除空的文件夹 参考:https://www.cnblogs.com/wang715100018066/p/9694532.html 2,这个只能说是技巧不能说是方 ...
- mysql 让id字段 以1000 形式开头
eg: alter table t_location AUTO_INCREMENT=1000;
- svn文件夹解锁批处理
清除svn文件的bat脚本整理 从svn上检出的项目,不在myeclipse工具中脱离svn的管辖,怎么办呢,下面有我的方法,也是借鉴别人的,用了特别好使,故推荐给大家. 首先创建一个xxx.bat文 ...
- C# System.IO.StreamReader
实现一个 TextReader,使其以一种特定的编码从字节流中读取字符. using System; using System.IO; class Test { public static void ...
- 【Tensorflow】Tensorflow r1.0, Ubuntu, gpu, conda安装说明
Install Anaconda and python 1. cuda-8.0 download cuda_8.0.61_375.26_linux.run ./cuda_8.0.61_375.26_l ...