blocks

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int n,m,flag=1,cnt;
 5 int a,b,x,y,c;
 6 int movee[4][2]={-1,0,1,0,0,-1,0,1};
 7 int p[505][505];
 8 int f[250050];//存点
 9 int find(int x){
10     if(f[x]==x)
11         return x;
12     else{
13         f[x]=find(f[x]);
14         return f[x];
15     }
16 }
17 int main(){
18     scanf("%d%d",&n,&m);
19     memset(p,-1,sizeof(p));
20     for(int i=1;i<=n*n;i++)
21         f[i]=i;
22     for(int i=1;i<=m;i++){
23         scanf("%d%d%d",&c,&x,&y);
24         p[x][y]=c;
25         flag=1;
26         for(int j=0;j<4;j++)
27         {
28             int x1=x+movee[j][0],y1=y+movee[j][1];//左右上下找
29             if(x1>0&&y1>0&&x1<=n&&y1<=n&&p[x][y]==p[x1][y1])
30             {//合法且颜色相同
31                 a=find((x1-1)*n+y1);//旁边点找出的爹
32                 b=find((x-1)*n+y);//本来的爹(都是把二维转化成一维)
33                 if(a!=b&&flag)
34                 {
35                     f[b]=a;
36                     flag=0;//已经连上
37                 }
38                 else if(a!=b&&!flag)
39                 {
40                     cnt--;
41                     f[a]=f[b];
42                 }
43             }
44             if(j==3&&flag)
45             {
46                 cnt++;
47             }//这层一定要放在外面
48         }
49         printf("%d
",cnt);
50     }
51     return 0;
52 }
原文地址:https://www.cnblogs.com/al76/p/8298482.html