因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的

又因为点只有三种,黑白无

所以可以用并查集优化

添加一个棋子就判断周围四个的组别情况

注意出现的情况与答案关系之间的判别

#include<stdio.h>
#include<memory.h>
int N,M,dx[]={,,-,},dy[]={,,,-},gp[];
char cm[][];
int findp(int p){
return p==gp[p]?p:(gp[p]=findp(gp[p]));
}
int prime(int x,int y){
return x>=&&y>=&&x<N&&y<N;
}
int main(){
int i,j,X,Y,xx,yy,ans=,g,d1,d2;
char C;
memset(cm,'.',sizeof cm);
for(i=;i<;i++)
gp[i]=i;
scanf("%d%d",&N,&M);
for(i=;i<M;i++){
scanf("%*c%c%d%d",&C,&X,&Y);
ans++;
for(g=j=;j<;j++){
xx=X-+dx[j];
yy=Y-+dy[j];
if(prime(xx,yy)&&cm[xx][yy]==C){
d1=findp(gp[(X-)*N+(Y-)]);
d2=findp(gp[xx*N+yy]);
if(!g){//周围4个位置如果还没有找到一个同集合的,可以直接合并并减少一个答案组
g=;
if(d1!=d2){
if(d1<d2)
gp[d2]=d1;
else
gp[d1]=d2;
}
ans--;
}
else{//周围4个位置如果已经找到一个同组的了,只有两个点所在的集合不同时才需要合并并减少一个答案组
if(d1!=d2){
if(d1<d2)
gp[d2]=d1;
else
gp[d1]=d2;
ans--;
}
}
}
}
cm[X-][Y-]=C;
printf("%d\n",ans);
} return ;
}

最新文章

  1. JavaScript JsTree实例
  2. 百度,淘宝,腾讯三大巨头HTML页面规范分解
  3. Javascript——闭包、作用域链
  4. [转载]JavaScript内存分析
  5. Mastering Web Application Development with AngularJS 读书笔记-前记
  6. iOS cannot find folder xcdatamodeld Xcode 7
  7. 利用AdaBoost元算法提高分类性能
  8. stl的优先级队列
  9. 编译安装apache下添加mod_rewrite支持
  10. UI开发中的Unit test新工具:网页抓屏比较
  11. POJ 1556 The Doors(线段交+最短路)
  12. org.apache.catalina.mbeans.ServerLifecycleListener
  13. 定时器NSTimer的用法
  14. LoadRunner安装停在注册界面安装失败----解决办法之一
  15. MFC下DLL编程(图解)
  16. Sed简介 (转)
  17. Asp.Net Core MailKit 完美附件(中文名、长文件名)
  18. C#中替换特殊字符串
  19. GO语言的进阶之路-爬虫进阶之路
  20. 【Java】 剑指offer(54) 二叉搜索树的第k个结点

热门文章

  1. 学习spring第五天 mybatis+spring的整合(maven多模块数据查询使用了分页和连接池),以及aop
  2. phi
  3. 关于SI4432数据手册的简单讲解
  4. PHP循环语句练习题
  5. Ganglia 安装 No package &#39;ck&#39; found
  6. UVALive 3634 数据结构模拟
  7. UML-设计模式-缓存策略
  8. 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询
  9. JFrame的面板结构和JPanel的使用
  10. 7.3 使用while 循环来处理列表和字典