hdu多校第八场 1009 (hdu6665) Calabash and Landlord 计算几何/dfs
题意:
给定两个矩形,输出这两个矩形把平面分成了多少块。
题解:
本来是道计算几何的大讨论,被我生生写成了bfs。
离散化边,注意不重合的边中间要空出来一格,四周也要空出来一圈,然后暴力bfs计算一共有几块即可。
不这么暴力的方法倒也不是没有,观察下图,点与长方形的关系存在如下25种,那么两点确定一个长方形,两个长方形的关系则共有625种
至于这个表怎么打,好像还得借助一下bfs。
#include<iostream> #include<queue> #include<algorithm> #include<cstring> using namespace std; int mapp[11][11]; int x[5],y[5]; const int changex[4]={0,0,1,-1}; const int changey[4]={1,-1,0,0}; void lsh(int *a){ int b[5]; bool flag[5]={}; b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4]; sort(b+1,b+5); int l=unique(b+1,b+5)-b-1; for(int i=1;i<=l;i++){ for(int j=1;j<=4;j++){ if(a[j]==b[i] && flag[j]==0){ a[j]=2*i; flag[j]=1; } } } return ; } int solve(){ int ans=0; memset(mapp,0,sizeof mapp); // printf("a:%d %d %d %d\n",x[1],y[1],x[2],y[2]); // printf("b:%d %d %d %d\n",x[3],y[3],x[4],y[4]); for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ if((i==x[1] || i==x[2]) && j>=y[1] && j<=y[2]){ mapp[i][j]=-1; } if((j==y[1] || j==y[2]) && i>=x[1] && i<=x[2]){ mapp[i][j]=-1; } if((i==x[3] || i==x[4]) && j>=y[3] && j<=y[4]){ mapp[i][j]=-1; } if((j==y[3] || j==y[4]) && i>=x[3] && i<=x[4]){ mapp[i][j]=-1; } } } // for(int i=1;i<=10;i++){ // for(int j=1;j<=10;j++){ // printf("%c ",mapp[i][j]==-1?'*':mapp[i][j]+'0'); // } // printf("\n"); // } // queue<int> qx,qy; for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ if(mapp[i][j]==0){ ans++; mapp[i][j]=ans; qx.push(i); qy.push(j); } while(!qx.empty()){ int xx=qx.front(); int yy=qy.front(); qx.pop();qy.pop(); // printf("%d %d:",xx,yy); for(int k=0;k<4;k++){ int xxx=xx+changex[k]; int yyy=yy+changey[k]; // printf("%d %d ",xxx,yyy); if(xxx>=1 && xxx<=10 && yyy>=1 && yyy<=10 && mapp[xxx][yyy]==0){ qx.push(xxx); qy.push(yyy); mapp[xxx][yyy]=ans; } } // printf("\n"); } // for(int i=1;i<=10;i++){ // for(int j=1;j<=10;j++){ // printf("%c ",mapp[i][j]==-1?'*':mapp[i][j]+'0'); // } // printf("\n"); // } } } return ans; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d %d %d %d",&x[1],&y[1],&x[2],&y[2]); scanf("%d %d %d %d",&x[3],&y[3],&x[4],&y[4]); lsh(x);lsh(y); printf("%d\n",solve()); // for(int i=1;i<=10;i++){ // for(int j=1;j<=10;j++){ // printf("%c ",mapp[i][j]==-1?'*':mapp[i][j]+'0'); // } // printf("\n"); // } } }