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 的点来判断 ...
随机推荐
- Win7 U盘安装Ubuntu16.04 双系统详细教程(方法一)
主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: 四. 用EasyBCD 创建启动系统启动引导: (根据个人情 ...
- 使用Beetle简单构建聊天室程序
之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...
- SharePoint 2013 创建 Site Collection
在之前的文章中,通过SharePoint Central Administration 创建了Web Application.在这篇文章中将继续SharePoint 2013之旅——还是以Step B ...
- python字符串格式化之学习笔记
在python中格式化输出字符串使用的是%运算符,通用的形式为 •格式标记字符串 % 要输出的值组其中,左边部分的”格式标记字符串“可以完全和c中的一致.右边的'值组'如果有两个及以上的值则需要用小括 ...
- 10.翻译:EF基础系列---EF中的持久性
原文链接:http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx ...
- 一个将java事物的非常好的栗子
地址:http://www.cnblogs.com/davenkin/archive/2013/02/16/java-tranaction-1.html
- 转 kafka 清理数据
由于项目原因,最近经常碰到Kafka消息队列拥堵的情况.碰到这种情况为了不影响在线系统的正常使用,需要大家手动的清理Kafka Log.但是清理Kafka Log又不能单纯的去删除中间环节产生的日志, ...
- 如何在 Mac 上通过 Boot Camp 安装 Windows?
如何在 Mac 上通过 Boot Camp 安装 Windows? The following contents are chosen from the apple website, thanks f ...
- 使用 http 请求方式获取 eureka server的服务信息
对于一些系统不能接入 eureka server,又需要访问接入eureka server 的服务. 方法一:直接调用服务的地址是一种实现方式,弊端就是地址是写死的,万一服务地址变更则访问不到. 方法 ...
- 在springboot 和 mybatis 项目中想要显示sql 语句进行调试
在springBoot+Mybatis日志显示SQL的执行情况的最简单方法就是在properties新增: logging.level.com.dy.springboot.server.mapper= ...