HDOJ-6665(+ DFSディスクリート部品接続部品)

カラバッシュと家主

HDOJ-6665

  • ここでは、知識の離散的な研究です。
  • まず、xとyの二つの配列、これら2つのアレイがソートさに調整します。そう5の座標の合計数のみ5その上の2つの配列の大きさは(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