HDOJ-6665(离散化+DFS求连通分量)

Calabash and Landlord

HDOJ-6665

  • 这里考察的是离散化的知识。
  • 首先将所有的x坐标和y坐标放入两个数组中,然后对这两个数组进行排序。因为总共的坐标数就5个所以这两个数组的大小只需要5就可以了(从1开始)。
  • 然后利用lower_bound函数查找每一个点的横纵坐标的位置。这样就可以将点对应起来。
  • 最后使用dfs查找图中有多少个连通分量就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
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;
}

猜你喜欢

转载自www.cnblogs.com/GarrettWale/p/11362878.html