[hdu-6665]Calabash and Landlord 离散化+搜索 2019多校8
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6665
题目大意 : 给你两个矩形 问两个矩形把平面分为了多少部分(包括无穷大的部分)
题解:
1.把坐标离散化 然后把两个矩形缩小到10*10的矩阵里,搜索找连通块的个数(好写)
2.分类讨论 答案一共就 从2~6 5种情况 分别判断 可以判断好写的4个,剩下的就是第五种(比赛时写的,写if写到头秃)
AC代码(法1)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},a[10],b[10],x[10],y[10]; 4 bool vis[20][20]; 5 void dfs(int xi,int yi){ 6 vis[xi][yi]=1; 7 int nowx,nowy; 8 for(int i=0;i<4;i++){ 9 nowx=xi+dx[i];nowy=yi+dy[i]; 10 if(nowx<10&&nowx>=0&&nowy<10&&nowy>=0&&!vis[nowx][nowy])dfs(nowx,nowy); 11 } 12 } 13 int main(){ 14 int t; 15 scanf("%d",&t); 16 while(t--){ 17 memset(vis,0,sizeof(vis)); 18 for(int i=0;i<4;i++){ 19 scanf("%d%d",&x[i],&y[i]); 20 a[i]=x[i],b[i]=y[i]; 21 } 22 sort(a,a+4);sort(b,b+4); 23 int m1=unique(a,a+4)-a,m2=unique(b,b+4)-b; 24 for(int i=0;i<4;i++){ 25 x[i]=(lower_bound(a,a+m1,x[i])-a+1)*2; 26 y[i]=(lower_bound(b,b+m2,y[i])-b+1)*2; 27 } 28 for(int i=0;i<4;i+=2){ 29 for(int j=x[i];j<=x[i+1];j++)vis[j][y[i]]=vis[j][y[i+1]]=1; 30 for(int j=y[i];j<=y[i+1];j++)vis[x[i]][j]=vis[x[i+1]][j]=1; 31 } 32 int ans=0; 33 for(int i=0;i<10;i++) 34 for(int j=0;j<10;j++){ 35 if(!vis[i][j]){ 36 ans++; 37 dfs(i,j); 38 } 39 } 40 printf("%d\n",ans); 41 } 42 return 0; 43 }
AC代码(法2):
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int x1,y1,x2,y2,a1,b1,a2,b2; 5 int main() 6 { 7 // freopen("1.in","r",stdin); 8 int n; 9 scanf("%d",&n); 10 for(int i=0;i<n;i++) 11 { 12 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 13 scanf("%d%d%d%d",&a1,&b1,&a2,&b2); 14 if(x1>a1)//x1一定是左边那个 15 { 16 swap(x1,a1); 17 swap(y1,b1); 18 swap(x2,a2); 19 swap(y2,b2); 20 } 21 else 22 if(x1==a1&&y1>b1) 23 { 24 swap(x1,a1); 25 swap(y1,b1); 26 swap(x2,a2); 27 swap(y2,b2); 28 } 29 else 30 if(x1==a1&&y1==b1&&x2<a2) 31 { 32 swap(x1,a1); 33 swap(y1,b1); 34 swap(x2,a2); 35 swap(y2,b2); 36 } 37 else 38 if(x1==a1&&y1==b1&&x2==a2&&y2<b2) 39 { 40 swap(x1,a1); 41 swap(y1,b1); 42 swap(x2,a2); 43 swap(y2,b2); 44 }//确保x是大的那个 45 46 47 if(x1==a1&&x2==a2&&y1==b1&&y2==b2) 48 { 49 printf("2\n");//重合的情况 50 } 51 else 52 if( 53 (x2<=a1||y2<=b1||b2<=y1) || 54 (y1<=b1&&y2>=b2&&x2>=a2 && !(x1==a1&&x2==a2) && !(y1==b1&&y2==b2)) || 55 (y1<=b1&&y2>=b2&&x2>=a2 && (x1==a1&&x2==a2) && (y1==b1||y2==b2)) || 56 (y1<=b1&&y2>=b2&&x2>=a2 && (x1==a1||x2==a2) && (y1==b1&&y2==b2)) 57 )//相离相切或者是包含但是不能同时贴 58 { 59 printf("3\n"); 60 } 61 else 62 if((x1==a1&&x2<a2&&y1<b1&&y2>b2)||(x2==a2&&x1<a1&&y1>b1&&y2<b2)||(y1==b1&&x1<a1&&x2>a2&&y2<b2)||(y2==b2&&y1>b1&&x1<a1&&x2>a2)) 63 printf("5\n"); 64 else 65 if(b1<y1&&b2>y2&&a1>x1&&a2<x2) 66 { 67 printf("6\n"); 68 } 69 else 70 printf("4\n"); 71 } 72 return 0; 73 }