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"; }