• 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
    ",x[1],y[1],x[2],y[2]);
    //    printf("b:%d %d %d %d
    ",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("
    ");
    //        } 
    //    
        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("
    ");
                }
    //            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("
    ");
    //        } 
            }
        }
        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
    ",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("
    ");
    //        } 
        }
    } 
  • 相关阅读:
    获取AppSettings配置,获取连接字符串
    类在初始化的时候做了什么事
    Easyui Tabs 添加怎么添加。
    Tree数据格式 Easyui
    使用CodeFirst建表的时候要知道的特性
    从数据导出模型到pd设计器
    orm的几种排序写法
    Parallel.ForEach 并行循环的使用
    kendo gird 刷新数据源的几种方式
    表格设置宽度在ie9上无效
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11354391.html
Copyright © 2020-2023  润新知