zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    我回来了
    wget 官方jdk
    linux rpm命令安装卸载 初步使用
    关于一些对location认识的误区(转)
    直接插入排序
    冒泡排序
    Wireshark下TCP三次握手四次挥手
    linux内存使用率详解
    Linux下硬盘使用率详解及shell脚本实现
    Linux下CPU使用率详解
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/7811395.html
Copyright © 2011-2022 走看看