POJ 1066 线段相交

来源:互联网 发布:哪里能买到特效软件 编辑:程序博客网 时间:2024/05/16 17:36

题目的意思换句话说:就是要你以线段中的某个点和财宝(treasure)所在点连成一条直线,使得其和其它线段交点数最少;

这样理解的条件是: 财宝点 不在墙上.题目已给出,满足;

另外注意的是,初始化最小值肯定是一个很大的值inf; 如果最后得到的是inf,那就置为0(最后为1); 可能很多人错在这儿

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <queue>using namespace std;#define INF 0x3f3f3f3fconst int maxn = 30+3;#define eps 1e-8struct Point{    float x;    float y;}p[maxn*2],P0;int Sig(float x){    return (x > eps) - (x < -eps);}float Mult(Point p0, Point p1, Point p2){    return (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y);}int line_in_line(Point p1, Point p2, Point p3, Point p4){    return ( Sig(Mult(p1,p3,p2))*Sig(Mult(p1,p4,p2)) < 0 && Sig(Mult(p3,p1,p4))*Sig(Mult(p3,p2,p4)) < 0 );}int main(){#ifndef ONLINE_JUDGE    freopen("in","r",stdin);#endif    int n;    cin>>n;    for(int i = 0; i < n*2; i += 2)    {        cin>>p[i].x>>p[i].y>>p[i+1].x>>p[i+1].y;    }    cin>>P0.x>>P0.y;    int MIN = INF, num = 0;    for(int i = 0; i < n*2; i++)    {        num = 0;        for(int j = 0; j < n*2-1; j += 2)        {            if(line_in_line(P0,p[i],p[j],p[j+1]))                num++;        }//        cout<<i<<" "<<num<<endl;        MIN = num < MIN ? num: MIN;    }    if(MIN == INF )        MIN = 0;    cout<<"Number of doors = "<<MIN+1<<endl;    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 牙咽肚子里了怎么办 假牙吃肚子里了怎么办 陶瓷牙咽肚子里怎么办 做飞机耳朵疼难忍怎么办 肚子痛又拉不出来怎么办 胃胀气打嗝想吐怎么办 胃胀吐酸水恶心怎么办 一岁宝宝胃胀气怎么办 3岁宝宝腹胀呕吐怎么办 胃胀气想吐怎么办快速 胃胀然后吐了怎么办 1岁宝宝胃胀气怎么办 孩子胃胀气还吐怎么办 肚子里进了凉气怎么办 肠胃涨气肚子变大怎么办 感觉肚子胀胀的怎么办 肚子胀撑的难受怎么办 肚子着凉了很疼怎么办 来月经肚子疼怎么办最快的方法 孕妇上大便有血怎么办 做完爱小腹坠痛怎么办 月经不来肚子胀怎么办 月经期间肚子疼的厉害怎么办 大姨吗来了肚子疼该怎么办 孕妇7个月拉肚子怎么办 胃疼肚子也疼怎么办 6个月孕妇肚子疼怎么办 孕妇4个月肚子疼怎么办 孕妇5个月拉肚子怎么办 4个月孕妇拉肚子怎么办 怀孕5个月拉肚子怎么办 肠胃老是胀气很不舒服怎么办 肚子里有气排不出来怎么办 小兔子不吃兔粮怎么办 泰迪肚子一直叫怎么办 狗狗肚子响该怎么办 狗狗肚子一直响怎么办 一刮风空调就响怎么办 胃里有气往上顶怎么办 胃里难受想吐怎么办 胃里感觉有水怎么办