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 的点来判断 ...
随机推荐
- rabbitMQ概念详细介绍
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- 在Linux下安装RabbitMQ
Installing on RPM-based Linux (CentOS, Fedora, OpenSuse, RedHat) 安装新版本的RabbitMQ出错: centos端口转发神器:soca ...
- 基于matplotlib的数据可视化(图形填充fill fill_between) - 笔记(二)
区域填充函数有 fill(*args, **kwargs) 和fill_between() 1 绘制填充多边形fill() 1.1 语法结构 fill(*args, **kwargs) args - ...
- numpy 数组创建例程
1 numpy.empty empty(shape[, dtype=float, order='C']) 创建指定 shape 和dtype 的未初始化数组 返回:ndarray. 说明:order ...
- mysql FullText全文索引的问题
今天有同学问题,搜索ip的时候怎样能把 select ip from tabelx where ip like '%192.168.0.1%' 这种句子的性能优化. 的确,使用 like %x 的方式 ...
- 站在.NET的角度学安卓的草民笔记1
Java -> .NET 安卓 -> winform/WPF 类继承Activity -> 类继承 For ...
- 用C写有面向对象特点的程序
比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在 ...
- Ubuntu局域网下利用client联网
Ubuntu是一个非常好的Linux操作系统,可是对于刚刚安装使用它的新手来说如何用Ubuntu连入网络却是一大难关.如今就记录一下自己在Ubuntu下上网的过程. ★client 将client解压 ...
- [转]IDEA 导出自己的jar包 并且在另一个工程中引用
1.导出jar包 1.1 idea导出jar包不如eclipse方便,但是熟练了也很容易操作 1.2 File -> Project Settings -> Artifacts(艺术品) ...
- 启动supervisord 生成openvpn用于android的证书
service supervisord start netstat -anp | grep 你的端口号 生成证书: 进入到openvpn的证书生成文件夹,通常在/etc/openvpn/easy-r ...