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

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

#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. CSS中详解height属性

    目录结构: contents structure [+] hight属性值类型一览表 height的%的使用 定义 实例 需要注意的 参考文章 hight属性值类型一览表 value describt ...

  2. 【struts2】拦截器基础

    1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...

  3. 一些实用的php库

    Idiorm – 轻量级ORM库 Snappy – 快照/PDF库 Buzz – 简单的HTTP请求库 Omnipay – 支付处理库 ShellWrap – 优美的命令行包装器

  4. golang学习 ---并发获取多个URL

    package main import ( "fmt" "io" "io/ioutil" "net/http" &quo ...

  5. 【转】Java 有值类型吗?

    Java 有值类型吗? 有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型( ...

  6. Fuel4d 2.3 公布

    [版本号编号]:Fuel4D 2.3. [公布日期]:2014年10月20日. [编译环境]:UNICODE.VS2010.x86. [开发环境]:ANSI/UTF-8/UNICODE.VS2005/ ...

  7. spring MVC中传递的参数对象中包含list的情况

    测试需要的jar包:spring 3.2.jar +  jackson-all-1.8.5.jar. 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过 ...

  8. HTML5无刷新修改URL

    HTML5新添加了两个api分别是pushState和replaceState,DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,可以在用户的访问记录中前进和 ...

  9. 设计模式C++实现——模板方法模式

    模式定义: 模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类能够在不改变算法结构的情况下,又一次定义算法中的某些步骤. 模板就是一个方法.更详细的说.这种方法将 ...

  10. RabbitMQ 消费端 Client CPU 100%的解决办法

    Func<bool> run = () => { try { using (IConnection conn = cf.CreateConnection()) { using (IM ...