因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的
又因为点只有三种,黑白无
所以可以用并查集优化
添加一个棋子就判断周围四个的组别情况
注意出现的情况与答案关系之间的判别
1 /*
2 Written By StelaYuri
3 */
4 #include<stdio.h>
5 #include<memory.h>
6 int N,M,dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},gp[250010];
7 char cm[505][505];
8 int findp(int p){
9 return p==gp[p]?p:(gp[p]=findp(gp[p]));
10 }
11 int prime(int x,int y){
12 return x>=0&&y>=0&&x<N&&y<N;
13 }
14 int main(){
15 int i,j,X,Y,xx,yy,ans=0,g,d1,d2;
16 char C;
17 memset(cm,'.',sizeof cm);
18 for(i=0;i<250000;i++)
19 gp[i]=i;
20 scanf("%d%d",&N,&M);
21 for(i=0;i<M;i++){
22 scanf("%*c%c%d%d",&C,&X,&Y);
23 ans++;
24 for(g=j=0;j<4;j++){
25 xx=X-1+dx[j];
26 yy=Y-1+dy[j];
27 if(prime(xx,yy)&&cm[xx][yy]==C){
28 d1=findp(gp[(X-1)*N+(Y-1)]);
29 d2=findp(gp[xx*N+yy]);
30 if(!g){//周围4个位置如果还没有找到一个同集合的,可以直接合并并减少一个答案组
31 g=1;
32 if(d1!=d2){
33 if(d1<d2)
34 gp[d2]=d1;
35 else
36 gp[d1]=d2;
37 }
38 ans--;
39 }
40 else{//周围4个位置如果已经找到一个同组的了,只有两个点所在的集合不同时才需要合并并减少一个答案组
41 if(d1!=d2){
42 if(d1<d2)
43 gp[d2]=d1;
44 else
45 gp[d1]=d2;
46 ans--;
47 }
48 }
49 }
50 }
51 cm[X-1][Y-1]=C;
52 printf("%d\n",ans);
53 }
54
55 return 0;
56 }
来源:https://www.cnblogs.com/stelayuri/p/12234942.html