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\n",cnt); 50 } 51 return 0; 52 }