HDOJ-6665 (+ ДФС дискретные компоненты, подключенные компоненты)

Кальян и Арендодатель

HDOJ-6665

  • Вот дискретное исследование знаний.
  • Прежде всего х и у координаты в двух массивов, то эти два массива сортируется. Поскольку общее число координат до 5, так что размер двух массивов только 5 на нем (начиная с 1).
  • Затем с помощью lower_bound функции находит положение каждого из горизонтальных и вертикальных координат точки. Эта точка может быть в ассоциации.
  • Найти последний использованный ДФС выяснить количество подключенных компонентов на ней.

#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