zoj 3761(并查集+搜索)
题意:在一个平面上,有若干个球,给出球的坐标,每次可以将一个球朝另一个球打过去(只有上下左右),碰到下一个球之后原先的球停下来,然后被撞的球朝这个方向移动,直到有一个球再也撞不到下一个球后,这个球飞出,球只能是朝上下左右四个方向打,并且要一个球四个方向都没有球了,这个球就不能打了。问说最少平面上剩几个球,并且给出打球的方案。
思路:把四个方向可以连成一块的球用一个并查集连起来,有多少个并查集,最后就会剩下多少个球,然后就是从并查集的叶子节点往根结点输出路径。这里要注意,不能重复输出,还有就是,在击打球的时候,有一个先后顺序,我们输出的时候,必须严格按照这个顺序,就是说,每次必须先把父节点所有的枝路径全部输出后,才能输出这个父节点及其父节点的路径........
#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(并查集+搜索)的更多相关文章
- 2018.09.24 bzoj1016: [JSOI2008]最小生成树计数(并查集+搜索)
传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形 ...
- hust 1385 islands 并查集+搜索
islands Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1385 Descri ...
- Connections in Galaxy War ZOJ - 3261 (并查集)
点权并查集的反向离线操作 题目大意:有n个stars,每一个都一定的“颜值”.然后stars与stars之间可以相连,query c表示再与c相连的stars中,颜值比c高的,stars的标号,如果有 ...
- zoj 2524 并查集裸
Description There are so many different religions in the world today that it is difficult to keep tr ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
- 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 ...
- Stanford Local 2016 E "Election of Evil"(搜索(正解)或并查集(划掉))
传送门 题意: 给出集合U,V,集合U有n个元素,集合V有m个元素: 有 m 个操作,mi : s1 s2 有一条s1指向s2的边(s1,s2可能属于第三个集合,暂且称之为K集合): 指向边具有传递性 ...
- HDU3926Hand in Hand(搜索 或 并查集)
Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...
- 【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】
第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断 ...
随机推荐
- CSS中详解height属性
目录结构: contents structure [+] hight属性值类型一览表 height的%的使用 定义 实例 需要注意的 参考文章 hight属性值类型一览表 value describt ...
- 【struts2】拦截器基础
1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...
- 一些实用的php库
Idiorm – 轻量级ORM库 Snappy – 快照/PDF库 Buzz – 简单的HTTP请求库 Omnipay – 支付处理库 ShellWrap – 优美的命令行包装器
- golang学习 ---并发获取多个URL
package main import ( "fmt" "io" "io/ioutil" "net/http" &quo ...
- 【转】Java 有值类型吗?
Java 有值类型吗? 有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型( ...
- Fuel4d 2.3 公布
[版本号编号]:Fuel4D 2.3. [公布日期]:2014年10月20日. [编译环境]:UNICODE.VS2010.x86. [开发环境]:ANSI/UTF-8/UNICODE.VS2005/ ...
- spring MVC中传递的参数对象中包含list的情况
测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar. 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过 ...
- HTML5无刷新修改URL
HTML5新添加了两个api分别是pushState和replaceState,DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,可以在用户的访问记录中前进和 ...
- 设计模式C++实现——模板方法模式
模式定义: 模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类能够在不改变算法结构的情况下,又一次定义算法中的某些步骤. 模板就是一个方法.更详细的说.这种方法将 ...
- RabbitMQ 消费端 Client CPU 100%的解决办法
Func<bool> run = () => { try { using (IConnection conn = cf.CreateConnection()) { using (IM ...