hihocoder #1487 : 岛屿3
Posted HelloWorld!--By-MJY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于hihocoder #1487 : 岛屿3的主要内容,如果未能解决你的问题,请参考以下文章