zoukankan      html  css  js  c++  java
  • [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
    ",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
    ");//重合的情况 
    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
    ");
    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
    ");
    64         else
    65         if(b1<y1&&b2>y2&&a1>x1&&a2<x2)
    66         {
    67             printf("6
    ");
    68         }
    69         else
    70         printf("4
    ");
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    LinQ表达式的一点点总结(二)select中新建对象
    给自己的博客添加分享到功能
    职场日记2上班第一天
    清楚屏幕右侧变化的数据Application.Current.Host.Settings.EnableFrameRateCounter = true;
    基于委托的异步
    C#中的装箱与拆箱
    关于java的初始化问题
    StreamReader类以及其方法ReadLine,Read,ReadToEnd的分析
    WP7的控件开发入门(二)
    单元测试的阶段性总结
  • 原文地址:https://www.cnblogs.com/conver/p/11358219.html
Copyright © 2011-2022 走看看