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 ...
随机推荐
- pycharm中调用函数方法自动补全p,m,c,v,f分别是什么意思
p:parameter 参数m:method 方法c:class 类v:variable 变量f:function 函数
- mysql bit 和 tinyint 的区别及使用场景?
bit类型语法:bit[(M)] : 位字段类型.M表示每个值的位数,范围从1到64.如果M被忽略,默认为1. tinyint是数字类型,存储小数, 一般对应编辑语言里的小字典或枚举类型. 节省空间的 ...
- 17.Python print()函数高级用法
前面使用 print() 函数时,都只输出了一个变量,但实际上 print() 函数完全可以同时输出多个变量,而且它具有更多丰富的功能. print() 函数的详细语法格式如下: print (val ...
- python学习之路(5)
条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age=20 if age>=18: ...
- JavaWeb之上传与下载
文件上传概述: 1,文件上传对页面的要求: 必须使用表单,而不能是超链接 表单的method必须是post 表单的enctype必须是multipart/form-data 在表单中添加file表单字 ...
- GreyMagic
hearthbuddy中的一段代码 // Token: 0x06001A79 RID: 6777 RVA: 0x000DD024 File Offset: 0x000DB224 internal In ...
- Jenkins发布
右键查看图片显示全图
- Mysql查询语句中字符型字段不区分大小写解决方法
项目中和前端联调的时候,发现Mysql查询语句中字符型字段值过滤是不区分大小写的,之前没有关注过这个设置,特意去网上看了下,原因是Mysql中“COLLATE”属性区分大小写,而该属性默认值为“utf ...
- Java servlet和JSP的区别和联系
Java servlet技术:在Java代码中嵌入HTML JSP技术:HTML输出时比较便捷,就在HTML中嵌入Java代码 Java servlet技术:擅长编写Java代码 JSP技术:擅长页面 ...
- MyBatis框架原理2:SqlSession运行过程
获取SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); 首先通过SqlSessionFactory的openSessi ...