题意:在xoy平面第一象限即x,y非负轴内,给定白色矩形的左下、右上顶点的坐标,再给定两个黑色矩形的左下、右上顶点的坐标,判断白色矩形能不能被看到(局部也算)。
比较简单,把思路理清,分类讨论即可。
1.白色矩形包含在某个黑色矩形内;
2.白色矩形被两个黑色矩形一起遮住,其中一块遮住它的上部分,另外一块遮住它的下部分;
3.白色矩形被两个黑色矩形一起遮住,其中一块遮住它的左部分,另外一块遮住它的右部分;
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int main()
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
int x3,y3,x4,y4;
cin>>x3>>y3>>x4>>y4;
int x5,y5,x6,y6;
cin>>x5>>y5>>x6>>y6;
bool flag=1;
if(x3<=x1&&y3<=y1&&x4>=x2&&y4>=y2) //被其中一块完全遮住
flag=0;
if(x5<=x1&&y5<=y1&&x6>=x2&&y6>=y2) //同上
flag=0;
if(y4<y6)
{
swap(x3,x5); swap(y3,y5);
swap(x4,x6); swap(y4,y6);
}
if(y4>=y2&&y3<=y2&&y6>=y3&&y5<=y1) //遮住上下部分
{
if(x3<=x1&&x4>=x2&&x5<=x1&&x6>=x2)
flag=0;
}
if(x4>x6)
{
swap(x3,x5); swap(y3,y5);
swap(x4,x6); swap(y4,y6);
}
if(x3<=x1&&x4>=x1&&x5<=x4&&x6>=x2) //遮住左右部分
{
if(y3<=y1&&y4>=y2&&y5<=y1&&y6>=y2)
flag=0;
}
if(flag) cout<<"YES\n";
else cout<<"NO\n";
return 0;
}
小结:分类讨论时,思路要理清,写一写伪代码也可以,可以事半功倍。