ZJNU 1333 - 第二题 blocks--中高级
2024-09-01 12:27:47
因为放一个就需要判断一次,每一次跑一遍全图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 ;
}
最新文章
- JavaScript JsTree实例
- 百度,淘宝,腾讯三大巨头HTML页面规范分解
- Javascript——闭包、作用域链
- [转载]JavaScript内存分析
- Mastering Web Application Development with AngularJS 读书笔记-前记
- iOS cannot find folder xcdatamodeld Xcode 7
- 利用AdaBoost元算法提高分类性能
- stl的优先级队列
- 编译安装apache下添加mod_rewrite支持
- UI开发中的Unit test新工具:网页抓屏比较
- POJ 1556 The Doors(线段交+最短路)
- org.apache.catalina.mbeans.ServerLifecycleListener
- 定时器NSTimer的用法
- LoadRunner安装停在注册界面安装失败----解决办法之一
- MFC下DLL编程(图解)
- Sed简介 (转)
- Asp.Net Core MailKit 完美附件(中文名、长文件名)
- C#中替换特殊字符串
- GO语言的进阶之路-爬虫进阶之路
- 【Java】 剑指offer(54) 二叉搜索树的第k个结点
热门文章
- 学习spring第五天 mybatis+spring的整合(maven多模块数据查询使用了分页和连接池),以及aop
- phi
- 关于SI4432数据手册的简单讲解
- PHP循环语句练习题
- Ganglia 安装 No package &#39;ck&#39; found
- UVALive 3634 数据结构模拟
- UML-设计模式-缓存策略
- 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询
- JFrame的面板结构和JPanel的使用
- 7.3 使用while 循环来处理列表和字典