博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
joj 1131 Intersection
阅读量:5081 次
发布时间:2019-06-13

本文共 1619 字,大约阅读时间需要 5 分钟。

一道wa了n+1次的题,都快绝望了,本想求助于网络上的各种代码,却发现一律模板,话说我现在还不知道模板为何物。。。。。。。终于在我的绞尽脑汁之下找到了错误,心情very舒畅,方法是看直线和矩形的各个边能不能相交(规范和非规范)以及他会不会在矩形里边:

#include<iostream>

#include<stdio.h>
using namespace std;
struct point{
    int x;
    int y;
};
int det(int a,int b,int c,int d)
{
    return a*d-b*c;
}
int cross(point a,point b,point c)
{
    int n=det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
    return n;
}
int main()
{
    int total_case,iii;
    scanf("%d",&total_case);
    for(iii=0;iii<total_case;iii++)
    {
        point start,end,l_t,l_b,r_t,r_b;
        scanf("%d%d%d%d%d%d%d%d",&start.x,&start.y,&end.x,&end.y,&l_t.x,&l_t.y,&r_b.x,&r_b.y);
        l_b.x=l_t.x;
        l_b.y=r_b.y;
        r_t.x=r_b.x;
        r_t.y=l_t.y;
        if(start.x==end.x)                                                                                         // 就是因为忘了这个才悲剧n次
        {
            if((start.y>l_t.y&&end.y>l_t.y)||(start.y<r_b.y&&end.y<r_b.y))
            {
                printf("F\n");
                continue;
            }
        }
        if(start.y==end.y)
        {
            if((start.x>r_b.x&&end.x>r_b.x)||(start.x<l_t.x&&end.x<l_t.x))
            {
                printf("F\n");
                continue;
            }
        }
        if(start.x>=l_t.x&&start.x<=r_b.x&&start.y<=l_t.y&&start.y>=r_b.y)
        {
            printf("T\n");
            continue;
        }
        int d1=cross(start,end,l_t);
        int d2=cross(start,end,r_t);
        int d3=cross(start,end,l_b);
        int d4=cross(start,end,r_b);
        int p1=cross(l_t,r_t,start);
        int p2=cross(l_t,r_t,end);
        int p3=cross(l_t,l_b,start);
        int p4=cross(l_t,l_b,end);
        int p5=cross(l_b,r_b,start);
        int p6=cross(l_b,r_b,end);
        int p7=cross(r_b,r_t,start);
        int p8=cross(r_b,r_t,end);
        if(d1*d2<=0&&p1*p2<=0)    //上
        {
            printf("T\n");
            continue;
        }
        if(d3*d4<=0&&p5*p6<=0)    //下
        {
            printf("T\n");
            continue;
        }
        if(d1*d3<=0&&p3*p4<=0)     //左
        {
            printf("T\n");
            continue;
        }
        if(d4*d2<=0&&p7*p8<=0)     //右
        {
            printf("T\n");
            continue;
        }
        printf("F\n");
    }
}

 

转载于:https://www.cnblogs.com/dchipnau/archive/2011/09/18/4985964.html

你可能感兴趣的文章
Hive异常- requestedMemory=1536, maxMemory=1024
查看>>
python 选择排序
查看>>
c#编程:使用"like“查询access数据库查询为空
查看>>
Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的...
查看>>
oracle常用管理命令
查看>>
构建之法第四章两人合作
查看>>
kmp-洛谷P2375 动物园
查看>>
杂曲歌辞·杨柳枝
查看>>
swiftmailer时没有设置https的选项,才可以发送成功。在linux下面
查看>>
C#程序分析
查看>>
(6)javascript 基本概念--- -- 函数
查看>>
『Python基础-4』字符串
查看>>
改变word的语言字典
查看>>
Android APP的安装路径
查看>>
煮鸡蛋的启示
查看>>
python_列表结构模拟栈和队列
查看>>
IIS支持.apk下载的方法
查看>>
vue mounted中监听div的变化
查看>>
MySQL二进制日志功能介绍
查看>>
Domino单用户多账号多邮件地址配置
查看>>