hihocoder #1487 : 岛屿3

面积  +1    周长  看旁边与之相邻的有几个 cnt   增加的变长  4-cc - cc

岛屿数目是否增加的话用并查集维护了

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
#include<set>
#include<vector>
using namespace std;


#define inf  1000000007
#define ll long long
#define MAXN  1010

bool vis[MAXN][MAXN];
int z[1000010];

int s1[4]={1,0,-1,0};
int s2[4]={0,1,0,-1};

int find1(int a)
{
    if(a!=z[a])
        return z[a]=find1(z[a]);
    return a;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF) // id (i-1)*n+j;
    {
        memset(vis,0,sizeof(vis));
        int num=0;
        int cnt=0;
        int da=0;
        for(int i=1;i<=1000000;i++)
            z[i]=i;
        for(int i=1;i<=n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            a++;
            b++;
            if(vis[a][b]==1)
                ;
            else
            {
                num++;
                vis[a][b]=1;
                int cc=0;
                for(int j=0;j<4;j++)
                {
                    if(vis[a+s1[j]][b+s2[j]])
                        cc++;
                }
       //       cout<<a<<" "<<b<<" "<<cc<<endl;
                if(cc==0)
                {
                    da++;
                }
                else
                {
                    int ind=-1;
                    for(int j=0;j<4;j++)
                    {
                        if(vis[a+s1[j]][b+s2[j]])
                        {
                            if(ind==-1)
                            {
                                ind=(a+s1[j]-1)*1000+b+s2[j];
                            }
                            else
                            {
                                int d=(a+s1[j]-1)*1000+b+s2[j];
                                int b=find1(d);
                                int fa=find1(ind);
                                if(b!=fa)
                                {
                                    da--;
                                    z[b]=fa;
                                }
                            }
                        }
                    }
                    int d=(a-1)*1000+b;
                    int b=find1(d);
                    int fa=find1(ind);
                    z[b]=fa;
                }
                cnt+=4-cc-cc;
            }
            cout<<da<<" "<<num<<" "<<cnt<<endl;
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/cherryMJY/p/7811395.html