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 ...
随机推荐
- ZeroMQ+QT 字符串收发
结合 Zeromq API函数 与 Qt 字符串QString QByteArray 实现字串收发: 发送端: zmq_msg_t msg; QString strT = “ABC汉字123”: QB ...
- 事件总线(EventBus)
Vue.prototype.$EventBus = new Vue() 不建议用,尽量用vuex,eventbus过于消耗浏览器资源 傻瓜版状态管理 一般的状态传递是在同时显示的情况下,倘若是在不同时 ...
- 剑指offer:关于复制构造函数
1:首先参看代码: #include "stdafx.h" #include "iostream" using namespace std; class A { ...
- Android Context介绍
转载(Android Context完全解析与各种获取Context方法):https://www.cnblogs.com/chenxibobo/p/6136693.html
- echarts_02
1. 如果数据加载时间较长,一个空的坐标轴放在画布上也会让用户觉得是不是产生 bug 了,因此需要一个 loading 的动画来提示用户数据正在加载. ECharts 默认有提供了一个简单的加载动画. ...
- 【攻克RabbitMQ】常见问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zlt995768025/article/ ...
- 如何将redis加入到Windows 服务中
将redis加入到Windows 服务的方法 原文出自:https://www.cnblogs.com/zoro-zero/p/5761507.html, 本文稍作完善 1.下载zip的Redis,对 ...
- List<Map>集合根据Map里某个key对List集合重新排序介绍
例1:List集合数据参考形式如下: [{GLXXLX=03,GLXXBH=20160226105812003},{GLXXLX=01,GLXXBH=20160226105812001},{GLXXL ...
- 微信、QQ第三方登录授权时的问题总结
一.微信第一个问题:redirect_uri域名与后台配置不一致,错误码:10003 解决方案: 1,首先确定访问的第三方接口地址参数前后顺序是否正确,redirect_uri回调地址是否加了http ...
- 【转】数组指针&指针数组
转自:https://www.cnblogs.com/mq0036/p/3382732.html 数组指针和指针数组的区别 数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p ...