C题就是判断两个正方形是否有重叠部分,其中一个是斜45度的,一个是正的,且顶点都是整数,所以如果有相交部分,那一定有整数点相交,所以思路就是把斜的正方形的整数点都找出来(只找边上的也可以)在判断每一个点是否在正的正方形内,如果都不在就是没有重叠的,否则就有,当时好可惜的是输入的时候少写了个=,还要多细心点代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int a[100],b[100];
struct mp
{
    int x,y;
    mp(int c,int d)
    {
        x=c;y=d;
    }
};
vector<mp>p;
int main()
{
    for(int i=0;i<8;i++)cin>>a[i];
    int x1=1000,x2=-1000,y1=1000,y2=-1000;
    for(int i=0;i<8;i++)
    {
        if(i%2==0)
        {
            if(a[i]<x1)x1=a[i];
            if(a[i]>x2)x2=a[i];
        }
        else
        {
            if(a[i]>y2)y2=a[i];
            if(a[i]<y1)y1=a[i];
        }
    }
    int s1=1000,s2=-1000,z1=1000,z2=-1000;
    for(int i=1;i<=8;i++)cin>>b[i];
    for(int i=1;i<=8;i++)
    {
        if(i%2==1)
        {
            if(b[i]<s1)s1=b[i];
            if(b[i]>s2)s2=b[i];    
        }
        else
        {
            if(b[i]<z1)z1=b[i];
            if(b[i]>z2)z2=b[i];
        }
    }
    int flag=0;
    p.clear();
    int w=(s2-s1)/2;
    int cnt=0;
    int r=(z2+z1)/2;
    while(cnt<=w)
    {
        for(int i=r-cnt;i<=r+cnt;i++) 
        p.push_back(mp(s1+cnt,i));
        for(int i=r-cnt;i<=r+cnt;i++) 
        p.push_back(mp(s2-cnt,i));
        cnt++;    
    }
    for(int i=0;i<p.size();i++)
    {
        if(p[i].x>=x1&&p[i].x<=x2&&p[i].y>=y1&&p[i].y<=y2)
        {
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        if(x1>=s1+w/2&&x2<=s2-w/2&&y1>=z1+w/2&&y2<=z2-w/2)flag=1;
    }
    if(flag==0)cout<<"NO";
    else cout<<"YES";
}
View Code

 

posted on 2021-01-31 17:17  小灰灰的父亲  阅读(47)  评论(0编辑  收藏  举报