这个题可以先离散化坐标,然后再把两个正方形的边存一下,然后在6x6的图里面跑一边DFS,能跑到的地方就标记成一个数字。
这样就可以把每个地方都染上颜色了。这里最重要的就是判断不能越过边界就是正方形的边。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=100005;
int t,v[7][7],ans=0;
struct node
{
double x,y;
} a[6];
struct bi{///存横向边界
double l,r,y;
}yy[6];
struct bi1{///竖向边界
double x,up,under;
}xx[6];
int mx[4]={1,0,-1,0},my[4]={0,1,0,-1};
vector<int>vx,vy;
int get_x(int x){
return lower_bound(vx.begin(),vx.end(),x)-vx.begin()+2;
}
int get_y(int y){
return lower_bound(vy.begin(),vy.end(),y)-vy.begin()+2;
}
void dfs(int x,int y){
if(v[x][y]!=0||x<1||x>6||y<1||y>6)
return;
v[x][y]=ans;
for(int i=0;i<4;i++){
int nx=x+mx[i];
int ny=y+my[i];
if(v[nx][ny]==0){
double sx=x+0.5,sy=y+0.5,ex=nx+0.5,ey=ny+0.5;//将dfs的点加0.5这样比较好判断
if(i%2==0){///xx
bool ok=true;
for(int j=1;j<=4;j++){
///判断不能跨过边界
if( ( (xx[j].x<ex&&xx[j].x>sx)||(xx[j].x>ex&&xx[j].x<sx) )&&(sy>xx[j].under&&sy<xx[j].up ) ){
ok=false; break;
}
}
if(ok)
dfs(nx,ny);
}
else{
bool ok=true;
for(int j=1;j<=4;j++){
if( ( (yy[j].y<ey&&yy[j].y>sy)||(yy[j].y>ey&&yy[j].y<sy) ) &&yy[j].l<sx&&yy[j].r>sx ){
ok=false; break;
}
}
if(ok)
dfs(nx,ny);
}
}
}
}
int main( )
{
//freopen("in.txt","r",stdin);
// ios::sync_with_stdio(false);
cin>>t;
while(t--){
vx.clear();vy.clear();ans=1;
memset(v,0,sizeof(v));
for(int i=1;i<=4;i++){
cin>>a[i].x>>a[i].y;
vx.push_back(a[i].x);
vy.push_back(a[i].y);
}
///离散化
sort(vx.begin(),vx.end());sort(vy.begin(),vy.end());
vx.erase(unique(vx.begin(),vx.end()),vx.end());
vy.erase(unique(vy.begin(),vy.end()),vy.end());
///离散化的时候起始点是从2开始这样方便染色
for(int i=1;i<=4;i++){
a[i].x=get_x(a[i].x);
a[i].y=get_y(a[i].y);
// cout<<a[i].x<<" "<<a[i].y<<endl;
}
///将边界存入四条横轴四条纵轴
for(int i=1;i<=4;i++){
yy[i].y=a[i].y;
if(i<=2){
yy[i].l=a[1].x;yy[i].r=a[2].x;
}else{
yy[i].l=a[3].x;yy[i].r=a[4].x;
}
xx[i].x=a[i].x;
if(i<=2){
xx[i].up=a[2].y;xx[i].under=a[1].y;
}else{
xx[i].up=a[4].y;xx[i].under=a[3].y;
}
//cout<<xx[i].x<<" "<<xx[i].up<<" "<<xx[i].under<<endl;
}
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(v[i][j]==0){
dfs(i,j);
ans++;
}
}
}
///查看染色情况
/* for(int j=6;j>0;j--){
for(int i=1;i<=6;i++){
cout<<v[i][j]<<" ";
}
cout<<endl;
}*/
cout<<ans-1<<endl;
}
return 0;
}