HNUSTOJ-1674 水果消除(搜索或并查集)
1674: 水果消除
时间限制: 2 Sec 内存限制: 128 MB
提交: 335 解决: 164
[提交][状态][讨论版]
题目描述
“水果消除”是一款手机游戏,相信大家都玩过或玩过类似的游戏。
下面是“水果消除”游戏的一种初始状态。
消除的基本规则:如果有2个或2个以上的相同水果连在一起,则可以点选并消除。
请问在某一种状态下,有几种可以点选并消除的选择方案。

例如,对于上图所示的初始状态,将有6种点选并消除的选择方案。这6种方案依次如下图所示。


输入
先输入一个整数n,表示放水果的格子总数为n*n。n取3到1000之间的整数(含3和1000)。
然后依次输入n*n个表示水果的数据,不同的水果用不同的数字表示,同一种水果用相同的数字表示。
表示水果的数字编号从1开始,不超过100。
输出
在输入数据对应的初始状态下,有几种点选并消除的选择方案。
输出方案数。
样例输入
6
1 1 2 2 2 2
1 3 2 1 1 2
2 2 2 2 2 3
3 2 3 3 1 1
2 2 2 2 3 1
2 3 2 3 2 2
样例输出
6
提示
来源
这道题可以直接DFS求连通块,也可以标号以后并查集;求连通块的时候要注意包含的格子至少为两个计数才加一;
DFS求连通块:
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; const int N = + ;
int mat[N][N];
bool visit[N][N];
int cur;
void DFS(int i,int j,int n,int color){
if(i< || j< || i>=n || j>=n) return;
if(visit[i][j]) return;
if(mat[i][j]!=color) return;
visit[i][j] = true;
cur++;
DFS(i+,j,n,color);
DFS(i-,j,n,color);
DFS(i,j+,n,color);
DFS(i,j-,n,color);
} int DFS_AL(int n){
int Count=;
memset(visit ,,sizeof(visit));
for(int i=;i<n;i++)
for(int j=;j<n;j++)
if(!visit[i][j]){
cur=;
DFS(i,j,n,mat[i][j]);
if(cur>)
Count++;
}
return Count;
} void Input_data(int n){
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%d",&mat[i][j]);
} int main(){
int n;
scanf("%d",&n);
Input_data(n);
printf("%d\n",DFS_AL(n));
}
并查集:
#include<cstdio>
#include<queue> using namespace std; const int MaxSize = +;
struct node1
{
int p;
int num;
}pre[MaxSize*MaxSize]; const int dir[][]= {{,},{,-},{,},{-,}};
short mat[MaxSize][MaxSize];
bool visit[MaxSize][MaxSize];
int Find(int x)
{
return pre[x].p==x?x:(pre[x].p=Find(pre[x].p));
} void Merge(int x,int y)
{
x= Find(x),y=Find(y);
if(x!=y)
{
pre[y].p=x;
pre[x].num += pre[y].num;
}
}
int main()
{
int n,i,j,k=,ans,h;
scanf("%d",&n);
for(i=; i<n; i++)
for(j=; j<n; j++)
{
scanf("%hd",&mat[i][j]);
pre[i*n+j].p=k++;
pre[i*n+j].num=;
visit[i][j]=false;
}
for(i=; i<n; i++)
for(j=; j<n; j++)
{
if(!visit[i][j])
{
visit[i][j] = true;
for(h=; h<; h++)
if(i+dir[h][]>= && i+dir[h][]<n && j+dir[h][]>= && j+dir[h][]<n )
if(mat[i][j] == mat[i+dir[h][]][j+dir[h][]])
Merge((i*n+j),((i+dir[h][])*n+j+dir[h][]));
}
}
for(ans=,i=; i<k; i++)
if(pre[i].p==i && pre[i].num > )
ans++;
printf("%d\n",ans);
}
//如有错误,还请留言指出
HNUSTOJ-1674 水果消除(搜索或并查集)的更多相关文章
- HDU3926Hand in Hand(搜索 或 并查集)
Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
- hdu 5652(并查集)
题意:很久之前,在中国和印度之间有通路,通路可以简化为一个n*m的字符串,0表示能通过,1表示障碍,每过一年就有一个坐标变成1,问你什么时候,通路彻底无法通过: 解题思路:无向图的连通性,一般直接搜索 ...
- HDU1213:How Many Tables(并查集入门)
-----------刷点水题练习java------------- 题意:给定N点,M边的无向图,问有多少个连通块. 思路:可以搜索; 可以并查集.这里用并查集练习java的数组使用,ans=N, ...
- Stanford Local 2016 E "Election of Evil"(搜索(正解)或并查集(划掉))
传送门 题意: 给出集合U,V,集合U有n个元素,集合V有m个元素: 有 m 个操作,mi : s1 s2 有一条s1指向s2的边(s1,s2可能属于第三个集合,暂且称之为K集合): 指向边具有传递性 ...
- 2018.09.24 bzoj1016: [JSOI2008]最小生成树计数(并查集+搜索)
传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形 ...
- 【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】
第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断 ...
- zoj 3761(并查集+搜索)
题意:在一个平面上,有若干个球,给出球的坐标,每次可以将一个球朝另一个球打过去(只有上下左右),碰到下一个球之后原先的球停下来,然后被撞的球朝这个方向移动,直到有一个球再也撞不到下一个球后,这个球飞出 ...
- hust 1385 islands 并查集+搜索
islands Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1385 Descri ...
随机推荐
- [BZOJ3786] 星系探索(括号序列+Splay)
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 2191 Solved: 644[Submit][Status][Discuss ...
- 套接字之msghdr结构
用户端在使用sendmsg/recvmsg发送或者接收数据时,会使用msghdr来构造消息,其对应的内核结构为user_msghdr:其中msg_iov向量指向了多个数据区,msg_iovlen标识了 ...
- mybayis分页插件
转载自 https://www.cnblogs.com/ljdblog/p/6725094.html
- 展示组件(Presentational component)和容器组件(Container component)之间有何不同
展示组件关心组件看起来是什么.展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态.(子组件)容器组件则更关心组件 ...
- 【编程漫谈】Hello world!
Hello world!是打开编程世界的第一把钥匙,只要你能运行出Hello world!,基本上就算入了个门了,因为程序正确的运行代表着基本开发环境都有了,包括编辑器,编译器,解释器,运行环境等待, ...
- [Flask]jinja2渲染分页导航部件
注意: 1.在视图函数中通过request.args.get('page')获取page数,并将page传给macros.html模板文件 效果: 点击8,就跳转到第8页数据了 视图函数 @app.r ...
- Selenium 2自动化测试实战4(引用模块)
一.模组1.模组也叫类库或模块,引用模块 在python中,通过import….或from….import….的方式引用模块,下面引用time模块 import time print (time.ct ...
- 阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上
创建maven的新项目 先复制坐标的依赖. 再把代码复制进来 先改造ioc的部分 复制上面一行代码.到下面 改成context 这里也是复制的上面两行代码.到下面改成context关键字 配置扫描的包 ...
- java:Oracle(聚合函数,多表查询,表之间的关系)
1.聚合函数 --max,min,sum,avg,count,nvl(,) -- max:最大值 -- max既能取数字的最大值,也可以取字符串的最大值(英文字母排列顺序),根据场景实际意义来看,最好 ...
- FileSystemWatcher监听文件事件
现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...