HDOJ-6665(离散化+DFS求连通分量)
阅读原文时间:2023年07月10日阅读:1

Calabash and Landlord

  • 这里考察的是离散化的知识。

  • 首先将所有的x坐标和y坐标放入两个数组中,然后对这两个数组进行排序。因为总共的坐标数就5个所以这两个数组的大小只需要5就可以了(从1开始)。

  • 然后利用lower_bound函数查找每一个点的横纵坐标的位置。这样就可以将点对应起来。

  • 最后使用dfs查找图中有多少个连通分量就可以了。

    #include
    #include
    #include
    #include
    #include
    using namespace std;
    int sx[5],tx[5];
    int sy[5],ty[5];
    int disx[5],disy[5];
    bool vis[10][10];
    int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    bool in(int x,int y){
    return x>0&&x<10&&y>0&&y<10; } void dfs(int x,int y){ vis[x][y]=1; for(int i=0;i<4;i++){ int ex=x+dir[i][0]; int ey=y+dir[i][1]; if(in(ex,ey)){ if(!vis[ex][ey]){ dfs(ex,ey); } } } } int main(){ int t; cin>>t;
    while(t--){
    memset(vis,0,sizeof(vis));
    int x,y;
    for(int i=1;i<=4;i++){ cin>>x>>y;
    tx[i]=sx[i]=x,ty[i]=sy[i]=y;
    }
    sort(tx+1,tx+5);
    sort(ty+1,ty+5);
    for(int i=1;i<=4;i++){
    disx[i]=lower_bound(tx+1,tx+5,sx[i])-tx;//保证大于等于1但是小于5
    disy[i]=lower_bound(ty+1,ty+5,sy[i])-ty;
    disx[i]=2; disy[i]=2;
    }
    for(int tex=disx[1];tex<=disx[2];tex++){
    vis[tex][disy[1]]=vis[tex][disy[2]]=1;
    }
    for(int tex=disx[3];tex<=disx[4];tex++){
    vis[tex][disy[3]]=vis[tex][disy[4]]=1;
    }
    for(int tey=disy[1];tey<=disy[2];tey++){
    vis[disx[1]][tey]=vis[disx[2]][tey]=1;
    }
    for(int tey=disy[3];tey<=disy[4];tey++){
    vis[disx[3]][tey]=vis[disx[4]][tey]=1;
    }
    int ans=0;
    for(int i=1;i<=9;i++){
    for(int j=1;j<=9;j++){
    if(!vis[i][j]){
    ans++;
    dfs(i,j);
    }
    }
    }
    cout<<ans<<endl;
    }
    return 0;
    }