https://codeforces.com/problemset/problem/993/A

题意:

给你两个矩形,第一行是一个正面表示的矩形,第二个是一个旋转四十五度角的矩形,问这两个矩形是否相交

思路:

刚开始的想法:

因为题目数据范围很小,所以很容易想到的是暴力枚举每个矩形中的每个点,若有点既在第一个矩形又在第二个矩形内,则这两个矩形相交

不过既然是数学题,就最好不要暴力了

要知道,如果两个正方形相交,那么其中一个正方形的四个角至少有一个处于另一个正方形内,或者一个正方形的中心处于另一个正方形内。

如果是正方形②的角在正方形①内的话,就很容易就可以判断,但是,如果是正方形①的角在正方形②内的话,就需要求出正方形②的边,然后根据点在直线的上下方关系来判断。

代码如下:

 #include "iostream"
#include "algorithm"
using namespace std;
int main()
{
double nu,nd,nl,nr,mu,md,ml,mr,mx,my,x,y;//u,d,l,r,分别记录最上,最下,最左,最右的值,mx,my记录的是正方形②中心的坐标
nu=nr=mu=mr=-;//由于范围是-100~100,所以赋初值
nd=nl=md=ml=;
for(int i=;i<;i++){
cin>>x>>y;
nd=min(nd,y);
nu=max(nu,y);
nl=min(nl,x);
nr=max(nr,x);
}
for(int i=;i<;i++){
cin>>x>>y;
md=min(md,y);
mu=max(mu,y);
ml=min(ml,x);
mr=max(mr,x);
}
mx=(ml+mr)/;
my=(mu+md)/;
//正方形②的角在正方形①中的情况,分别判断四个角,有一个在里面就成立
if(mx>=nl&&mx<=nr&&md>=nd&&md<=nu||mx>=nl&&mx<=nr&&mu>=nd&&mu<=nu||ml>=nl&&ml<=nr&&my>=nd&&my<=nu||mr>=nl&&mr<=nr&&my>=nd&&my<=nu)
cout<<"YES"<<endl;
//正方形①的角在正方形②中的情况,分别判断四个角,有一个在里面就成立,其中,诸如nu+nr>=ml+my的式子是判断点在直线的上方还是下方
else if(nu+nr>=ml+my&&nu<=nr-mx+mu&&nu>=nr-mx+md&&nu+nr<=mr+my||nd+nr>=ml+my&&nd<=nr-mx+mu&&nd>=nr-mx+md&&nd+nr<=mr+my)
cout<<"YES"<<endl;
else if(nu+nl>=ml+my&&nu<=nl-mx+mu&&nu>=nl-mx+md&&nu+nl<=mr+my||nd+nl>=ml+my&&nd<=nl-mx+mu&&nd>=nl-mx+md&&nd+nl<=mr+my)
cout<<"YES"<<endl;
//一个正方形中心在另一个中的情况
else if(mx>=nl&&mx<=nr&&my>=nd&&my<=nu)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return ;
}

这种想法不难, 就是有点麻烦。

另外在看别人的想法时看到一个比较有意思的解法:

from:https://blog.csdn.net/qq_40858062/article/details/80720092

因为正方形一个是正的,一个成45度角,第二个四边形完全在第一个上下左右就肯定不相交,要看的就是类似图中的情况,其实只要看中间这个小四边形周长和那个45度角四边形上下边界的差的大小关系就好了了,多画几张图可以看出来.....

照着他的思路敲了一遍,代码如下:

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; struct point
{
int x;
int y;
}; bool cmp(point a,point b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
} int main()
{
point a[];
point b[];
for(int i=;i<;i++)
scanf("%d %d",&a[i].x,&a[i].y);
for(int i=;i<;i++)
scanf("%d %d",&b[i].x,&b[i].y);
sort(a,a+,cmp);
sort(b,b+,cmp);
int flag=;
if(b[].x<=a[].x&&b[].x>=a[].x&&b[].y<=a[].y&&b[].y>=a[].y)
{
int p=min(abs(a[].x-b[].x),abs(a[].x-b[].x));
int q=min(fabs(a[].y-b[].y),fabs(a[].y-b[].y));
if((p+q)*>=b[].y-b[].y)
flag=;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
return ;
}

最新文章

  1. 项目游戏开发日记 No.0x000006(Finish)
  2. Python演讲笔记1
  3. interactivePopGestureRecognizer属性
  4. 每日Scrum(6)
  5. js 判断pc与手机
  6. Android中表示尺寸的六种度量单位
  7. 【 socke】C# socket端口复用-多主机头绑定
  8. tpl demo
  9. Windows Phone 8初学者开发—第8部分:理解编译和部署
  10. js系列教程2-对象、构造函数、对象属性全解
  11. 解决iar试调时程序无法进入主函数的问题
  12. R语言RODBC数据库操作
  13. memory prefix il ir im in out 3 i
  14. 修改Eclipse主题与Eclipse中使用SVN
  15. 根据模板导出Excel报表并复制模板生成多个Sheet页
  16. 【转发】Webdriver使用自定义Firefox Profile运行测试
  17. [bzoj3371][poj2009][Usaco2004 Mar]Moo University - Emergency Pizza Order 定制比萨饼
  18. mtk GPIO口
  19. docker (centOS 7) 使用笔记3 - docker swarm mode
  20. Mybatis逆向生成使用扩展类

热门文章

  1. 自定义 radio 的样式,更改选中样式
  2. css设置兄弟节点的样式(相邻的前一个节点)
  3. sql 左联 右联 内联的区别
  4. JS事件-对象监视事件,事件触发函数
  5. 开发app
  6. openstack trove redis配置项
  7. java 实现每次从list中取5000条数据放入新list
  8. ping内网服务器 新
  9. SpringCloud学习之Config分布式配置中心(八)
  10. python基础2--进制、字符编码和文件处理