P1355 神秘大三角

题目描述

判断一个点与已知三角形的位置关系。

输入输出格式

输入格式:

前三行:每行一个坐标,表示该三角形的三个顶点

第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系

(详见样例)

所有坐标值均为整数。

输出格式:

若点在三角形内(不含边界),输出1;

若点在三角形外(不含边界),输出2;

若点在三角形边界上(不含顶点),输出3;

若点在三角形顶点上,输出4。

输入输出样例

输入样例#1:

(0,0)
(3,0)
(0,3)
(1,1)

输出样例#1:

1

说明

【数据规模与约定】

对于100%数据,0<=所有点的横、纵坐标<=100

本题数据较弱,怎公搞都可以A。就当练练思路吧。

//自己脑洞的AC代码
#include<cstdio>
#include<cmath>
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
const double Pi=acos(-1);
struct node{
    int x,y;
    bool operator ==(const node &a){
        return x==a.x&&y==a.y;
    }
}A,B,C,D;
void init(){
    A.x=read();A.y=read();
    B.x=read();B.y=read();
    C.x=read();C.y=read();
    D.x=read();D.y=read();
}
double slop(node a,node b){
    if(a.x==b.x) return 1e9;
    return (double)(a.y-b.y)/(double)(a.x-b.x);
}
bool deal(node a,node b){//精度要求较高
    node t1,t2;
    t1.x=a.x-D.x;t1.y=a.y-D.y;
    t2.x=b.x-D.x;t2.y=b.y-D.y;
    double xiang=(double)(t1.x*t2.x+t1.y*t2.y);
    double mo=sqrt((t1.x*t1.x+t1.y*t1.y)*(t2.x*t2.x+t2.y*t2.y));
    double cita=xiang/mo;
    if(acos(cita)==Pi) return 1;
    else return 0;
}
void work(){
    if(D==A||D==B||D==C){puts("4");return ;}
    //点积求角 180则共线
    if(deal(A,B)){puts("3");return ;}
    if(deal(A,C)){puts("3");return ;}
    if(deal(B,C)){puts("3");return ;}
    //判断点是否在三角形中
    //http://files.cnblogs.com/files/shenben/%E5%88%A4%E6%96%AD%E7%82%B9%E6%98%AF%E5%90%A6%E5%9C%A8%E4%B8%89%E8%A7%92%E5%BD%A2%E4%B8%AD.sh
    if(slop(A,B)!=slop(A,C)&&slop(A,D)!=slop(B,C)
    &&(slop(A,D)-slop(A,B))*(A.x-B.x)*(slop(A,D)-slop(A,C))*(A.x-C.x)<=0
    &&(slop(A,D)-slop(B,C))*(A.x-D.x)*(slop(B,D)-slop(B,C))*(B.x-D.x)<0){
        puts("1");
    }
    else puts("2");
}
int main(){
    init();
    work();
    return 0;
}
//题解更好思路的AC代码
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
struct node{
    int x,y;
    bool operator ==(const node &a){
        return x==a.x&&y==a.y;
    }
}A,B,C,D;
void init(){
    A.x=read();A.y=read();
    B.x=read();B.y=read();
    C.x=read();C.y=read();
    D.x=read();D.y=read();
}
int calc(const node &a,const node &b,const node &c){//cross product
    return abs((a.x*b.y+b.x*c.y+c.x*a.y)-(a.x*c.y+b.x*a.y+c.x*b.y));
}
void work(){
    if(D==A||D==B||D==C) puts("4");
    else{//精度要求较低
        if(calc(D,A,B)+calc(D,A,C)+calc(D,B,C)!=calc(A,B,C)) puts("2");//面积不等,必在三角形外
        else if(!calc(D,A,B)||!calc(D,A,C)||!calc(D,B,C)) puts("3");//叉积=0,就在线段上(不严谨..)
        else puts("1");//只剩下在三角形内
    }
}
int main(){
    init();
    work();
    return 0;
}
时间: 2024-10-10 21:10:32

P1355 神秘大三角的相关文章

Codeforces Round #313 (Div. 2) C. Geralds Hexagon(补大三角.cpp

 Description Gerald got a very curious hexagon for his birthday. The boy found out that all the angles of the hexagon are equal to . Then he measured the length of its sides, and found that each of them is equal to an integer number of centimeters.

华为HCIE神秘大揭秘

1.全面解读华为认证流程 什么是华为认证? 华为认证是华为技术有限公司(简称"华为")推出了对网络方面的一个证书,这种证书类似于大家的毕业证书一样,企业或者用人单位在招聘的时候,会强制要求工程师具备某一项网络证书,比如HCIP证书或者HCIE证书 华为认证的分类 IP方向 IT方向 认证等级 HCIA证书:华为认证初级网络工程师 意味着企业有能力搭建基本的中小型网络,并将基本的语音.无线.云.安全和存储集成到网络之中,满足各种应用对网络的使用需求. HCIP证书:华为认证高级网络工程师

TYVJ计算几何

今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基本上没用,每次都把上次的main()函数删了接着继续写.... 原谅我曾经丑出翔的代码... 虽然现在也很丑... TYVJ 1543 房间最短路 题解: Floyd,dp[i][j]表示到第i面墙的第j个点的最短路,注意在更新最小值的时候判断两个点的连通 1 #include <cstdio>

IT人的情绪控制实践之路——与心魔斗争的第一步(前言)

    我不反对技术,但是反对把任何技术凌驾于真理之上的做法.  --电影<超时空接触> 一种形象的说法来形容当下IT行业的拼搏之路就像是西欧15-17世纪左右凶险繁盛的大航海世代--大家梦想着航行前往神秘的大陆,梦想着和那些街头小巷都认识的明星船长一样,带着征服海洋的热情,对未知知识的向往,更重要的是神秘大陆上遍地诱人的财富.那一箱箱的珠宝.钻石.香料.丝绸都让人们相信,无论多么困难重重,这都是一条最快积累财富的白银之路.但是,人们在出发前备齐了地图.领航员和食物,却不知道一路风暴所带来的曲

【poj1085】 Triangle War

http://poj.org/problem?id=1085 (题目链接) 题意 A,B两人玩游戏,在一个大三角形上放火柴,若A放上一根火柴后成功组成一个三角形,那么这个三角形就归属于A,并且A被奖励再放一根火柴.最后谁三角形多谁就胜. 给出一个残局,判断是否存在先手必胜策略. Solution 最近一直在颓,好久没刷题了... 这就是神乎其技的极大极小搜索,其实也差不多就是个贪心,基本很少用上,因为很难判断估价函数的正确性..详情请见:http://blog.csdn.net/gwq5210/

three.js 源码注释(十八)Math/Triangle.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中Math/Triangle.js文件的注释. 更多更新在 : https://gith

计算几何学习9

没有学特定的姿势 做了第二期的一些普通题 发现了自己很容易犯的一些错误 HDU 3264 给你一些互不相交,互不内含的圆,寻找一个最小的半径,使得在某点圆心处以该半径作圆时可以覆盖每个圆至少一半的面积 一看就是二分加两圆的面积交了,但是很智障的是,我当时并没有直接去求交集面积,而是额外去求了圆的交点,并且是求了两个弓形的面积之和 这样讨论起来就麻烦了,圆的优弧情况是对应扇形加上三角形,劣弧是减去,判断优弧劣弧的条件是一方半径平方大于另一方半径加上圆心距平方 不过还是写过了= = 当是敲了一个圆的

css之创建常用图形

css 创建常用图形 网站中有一些常见的图形用css就可以实现出来,本人就此总结了几种常用的css图形画法,引用链接http://www.cnblogs.com/lovemomo/p/4878293.html 圆形 .circle{ margin-top:50px; width: 100px; height: 100px; background:red; -moz-border-radius:50px; -webkit-border-radius:50px; border-radius: 50p

RoughSets属性约简算法

参考资料:http://baike.baidu.com/link?url=vlCBGoGR0_97l9SQ-WNeRv7oWb-3j7c6oUnyMzQAU3PTo0fx0O5MVXxckgqUlP871xR2Le-puGfFcrA4-zIntq 更多挖掘算法:https://github.com/linyiqun/DataMiningAlgorithm 介绍 RoughSets算法是一种比较新颖的算法,粗糙集理论对于数据的挖掘方面提供了一个新的概念和研究方法.本篇文章我不会去介绍令人厌烦的学术