[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 }

 

posted @ 2019-08-15 15:26  conver^_^  阅读(206)  评论(0编辑  收藏  举报