题意:在一个平面上,有若干个球,给出球的坐标,每次可以将一个球朝另一个球打过去(只有上下左右),碰到下一个球之后原先的球停下来,然后被撞的球朝这个方向移动,直到有一个球再也撞不到下一个球后,这个球飞出,球只能是朝上下左右四个方向打,并且要一个球四个方向都没有球了,这个球就不能打了。问说最少平面上剩几个球,并且给出打球的方案。

思路:把四个方向可以连成一块的球用一个并查集连起来,有多少个并查集,最后就会剩下多少个球,然后就是从并查集的叶子节点往根结点输出路径。这里要注意,不能重复输出,还有就是,在击打球的时候,有一个先后顺序,我们输出的时候,必须严格按照这个顺序,就是说,每次必须先把父节点所有的枝路径全部输出后,才能输出这个父节点及其父节点的路径........

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int father[2005],rank[2005],n,num[2005];
int s[2005][2];
bool vist[2005],vist1[2005],vist2[2005];
void dfs(int v)
{
if(num[v]>=2)
{
num[v]--;
return;
}
if(father[v]==v)
return;
if(!vist2[v])
{
if(rank[v]==0)
printf("(%d, %d) LEFT\n",s[v][0],s[v][1]);
if(rank[v]==1)
printf("(%d, %d) RIGHT\n",s[v][0],s[v][1]);
if(rank[v]==2)
printf("(%d, %d) DOWN\n",s[v][0],s[v][1]);
if(rank[v]==3)
printf("(%d, %d) UP\n",s[v][0],s[v][1]);
}
vist2[v]=true;
dfs(father[v]);
}
void dfs1(int i)
{
for(int j=0; j<n; j++)
{
if(vist[j]) continue;
/*if(s[i][0]==s[j][0]&&s[i][1]==s[j][1])
{
father[j]=i;
rank[j]=1;
vist[j]=true;
vist1[i]=true;
dfs1(j);
}*/
if(s[i][0]==s[j][0]&&s[i][1]<s[j][1])
{
father[j]=i;
rank[j]=2;
num[i]++;
vist[j]=true;
vist1[i]=true;
dfs1(j);
}
if(s[i][0]==s[j][0]&&s[i][1]>s[j][1])
{
father[j]=i;
rank[j]=3;
num[i]++;
vist[j]=true;
vist1[i]=true;
dfs1(j);
}
if(s[i][1]==s[j][1]&&s[i][0]<s[j][0])
{
father[j]=i;
rank[j]=0;
num[i]++;
vist[j]=true;
vist1[i]=true;
dfs1(j);
}
if(s[i][1]==s[j][1]&&s[i][0]>s[j][0])
{
father[j]=i;
rank[j]=1;
num[i]++;
vist[j]=true;
vist1[i]=true;
dfs1(j);
}
}
}
int main()
{
while(scanf("%d",&n)>0)
{
for(int i=0; i<=n; i++)
{
father[i]=i;
rank[i]=-1;
num[i]=0;
}
memset(vist,false,sizeof(vist));
memset(vist1,false,sizeof(vist1));
memset(vist2,false,sizeof(vist2));
for(int i=0; i<n; i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
}
for(int i=0; i<n; i++)
{
if(vist[i]) continue;
vist[i]=true;
dfs1(i);
}
int cnt=0;
for(int i=0; i<n; i++)
{
if(father[i]==i)
cnt++;
}
printf("%d\n",cnt);
for(int i=0; i<n; i++)
if(!vist1[i])
{
dfs(i);
}
}
return 0;
}

  

zoj 3761(并查集+搜索)的更多相关文章

  1. 2018.09.24 bzoj1016: [JSOI2008]最小生成树计数(并查集+搜索)

    传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形 ...

  2. hust 1385 islands 并查集+搜索

    islands Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1385 Descri ...

  3. Connections in Galaxy War ZOJ - 3261 (并查集)

    点权并查集的反向离线操作 题目大意:有n个stars,每一个都一定的“颜值”.然后stars与stars之间可以相连,query c表示再与c相连的stars中,颜值比c高的,stars的标号,如果有 ...

  4. zoj 2524 并查集裸

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  5. 【搜索】【并查集】Codeforces 691D Swaps in Permutation

    题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...

  6. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  7. Stanford Local 2016 E "Election of Evil"(搜索(正解)或并查集(划掉))

    传送门 题意: 给出集合U,V,集合U有n个元素,集合V有m个元素: 有 m 个操作,mi : s1 s2 有一条s1指向s2的边(s1,s2可能属于第三个集合,暂且称之为K集合): 指向边具有传递性 ...

  8. HDU3926Hand in Hand(搜索 或 并查集)

    Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...

  9. 【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】

    第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断 ...

随机推荐

  1. git学习笔记(三)—— 远程仓库

    一.gitHub&&SSH Key 为git仓库提供托管服务的,所以注册一个github账号,就可以免费获得git远程仓库. 本地Git仓库和GitHub仓库之间的传输是通过SSH加密 ...

  2. HDU 4638 Group (线段树 | 树状数组 + 离线处理)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. MachineLearning之Logistic回归

    一.概述 假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称为回归: 利用Logistic回归进行分类的主要思想是: 根据现有数据对分类边界线建立回归公式, ...

  4. Bootstrap表单构造器

    http://www.bootcss.com/p/bootstrap-form-builder/

  5. [转]同步对象Event的用法

    同步对象Event的用法  首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面.  CreateEvent函数功能描述:创建或打开一个命名的或无名的事 ...

  6. U811.1接口EAI系列之二--生成销售出库单调用U8的EAI通用处理方法--PowerBuilder语言

    1.销售系统销售出库,更新U811.1材料库存的EAI的XML生成. 2.主要根据U8配置会生成出库单和同时是否更新库存量,还是更新现存量等等. 3.具体参考代码如下: 作者:王春天 2013-11- ...

  7. springboot 中使用Druid 数据源提供数据库监控

    一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...

  8. XML5个转义符

    XML5个转义符:<,>,&,”,©;的转义字符分别如下: < >& " &apos;

  9. sqlserver自定义函数与存储过程的区别 实例详解

    分享下sql server自定义函数与存储过程的区别,一起来学习下. 一.自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数: 不能用临时表: 函数内部的操作不能影响到 ...

  10. [svc]java初步

    J2EE.J2SE 和 J2ME 三者的区别有哪些? J2SE, 主要是桌面软件开发,包括swing 等.是后面2个的基础,但是我们不用它做桌面开发.只学习语法. J2EE,网站开发,servlet. ...