zoukankan      html  css  js  c++  java
  • Counting Islands II

    Counting Islands II

    描述

    Country H is going to carry out a huge artificial islands project. The project region is divided into a 1000x1000 grid. The whole project will last for N weeks. Each week one unit area of sea will be filled with land.

    As a result, new islands (an island consists of all connected land in 4 -- up, down, left and right -- directions) emerges in this region. Suppose the coordinates of the filled units are (0, 0), (1, 1), (1, 0). Then after the first week there is one island:  

    #...
    ....
    ....
    ....
    

    After the second week there are two islands:  

    #...
    .#..
    ....
    ....
    

    After the three week the two previous islands are connected by the newly filled land and thus merge into one bigger island:

    #...
    ##..
    ....
    ....
    

    Your task is track the number of islands after each week's land filling.  

    输入

    The first line contains an integer N denoting the number of weeks. (1 ≤ N ≤ 100000)  

    Each of the following N lines contains two integer x and y denoting the coordinates of the filled area.  (0 ≤ x, y < 1000)

    输出

    For each week output the number of islands after that week's land filling.

    样例输入
    3  
    0 0   
    1 1   
    1 0   
    样例输出
       1  
       2  
       1  
    分析:并查集,注意将二维坐标转化为一维;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include <algorithm>
    #include <string>
    #include <cstring>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    const int maxn=1e6+10;
    using namespace std;
    int n,m,p[maxn],ans;
    char mip[1010][1010];
    int fa(int x)
    {
        return p[x]==x?x:p[x]=fa(p[x]);
    }
    void work(int x,int y)
    {
        ans++;
        int a,b;
        if(x-1>=0&&mip[x-1][y]=='#')
        {
            a=fa(x*1000+y),b=fa((x-1)*1000+y);
            if(a!=b)p[a]=b,ans--;
        }
        if(x+1<1000&&mip[x+1][y]=='#')
        {
            a=fa(x*1000+y),b=fa((x+1)*1000+y);
            if(a!=b)p[a]=b,ans--;
        }
        if(y-1>=0&&mip[x][y-1]=='#')
        {
            a=fa(x*1000+y),b=fa(x*1000+y-1);
            if(a!=b)p[a]=b,ans--;
        }
        if(y+1<1000&&mip[x][y+1]=='#')
        {
            a=fa(x*1000+y),b=fa(x*1000+y+1);
            if(a!=b)p[a]=b,ans--;
        }
        return;
    }
    int main()
    {
        int i,j,k,t;
        rep(i,0,maxn-10)p[i]=i;
        memset(mip,'.',sizeof(mip));
        scanf("%d",&n);
        while(n--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            mip[x][y]='#';
            work(x,y);
            printf("%d
    ",ans);
        }
        //system("pause");
        return 0;
    }
  • 相关阅读:
    centos7系统初始化
    瀑布流无限加载infinitescroll插件与masonry插件使用
    网页前端导出CSV,Excel格式文件
    js添加收藏夹
    Fiddler修改http请求响应简单实例
    Nodejs的Gruntjs使用一则
    Jquery插件validate使用一则
    PostgreSQL操作-psql基本命令
    SSH连接时出现Host key verification failed的原因及解决方法以及ssh-keygen命令的用法
    在ubuntu20.04上设置python2为默认方式
  • 原文地址:https://www.cnblogs.com/dyzll/p/5711474.html
Copyright © 2011-2022 走看看