ZOJ 3761 Easy billiards 月赛E DFS
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761
题目大意:给定n个位置的小球,小球的运动方向只能是水平或者竖直的。按一定方向推动某球,当行径上有其他球时,停留在被撞球的位置,被撞的球沿原小球运动方向运动,当行径路径上没有其他球时,该小球被剔除。问:只能通过小球的相撞来剔除小球,最少能留下几个小球。
解题思路:首先,可以用并查集找出互相连通的小球集合个数。因为每一次推动的结果可以看成是被推动的小球被剔除了,其他位置上的小球不动,所以可以从每个集合中任选一个小球作DFS。选择推动小球的方向即为该球指向其父亲节点的方向。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int set[];
int e,first[],next[],v[];
bool vis[];
struct node
{
int x,y,l,id;
}p[],q[];
bool cmp1(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool cmp2(node a,node b)
{
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
void link(int a,int b)
{
v[e]=b;
next[e]=first[a];
first[a]=e++;
}
int find(int x)
{
if(set[x]==x)
return x;
else return set[x]=find(set[x]);
}
void UN(int a,int b)
{
int aa,bb;
aa=find(a);
bb=find(b);
if(aa==bb)
return;
else
set[aa]=set[bb];
}
void solve(int now)
{
int k;
for(int i=first[now];i!=-;i=next[i])
{
k=v[i];
if(!vis[k])
{
vis[k]=true;
if(q[now].x==q[k].x)
{
if(q[now].y>q[k].y)//up
q[k].l=;
else
q[k].l=;//down
}
else
{
if(q[now].x>q[k].x)//right
q[k].l=;
else
q[k].l=;//left;
}
solve(k);
}
}
if(q[now].l==)
printf("(%d, %d) LEFT\n",q[now].x,q[now].y);
else if(q[now].l==)
printf("(%d, %d) RIGHT\n",q[now].x,q[now].y);
else if(q[now].l==)
printf("(%d, %d) UP\n",q[now].x,q[now].y);
else if(q[now].l==)
printf("(%d, %d) DOWN\n",q[now].x,q[now].y);
return;
} int main()
{
int n,j,i,lef[],ans;
while(~scanf("%d",&n))
{
memset(first,-,sizeof(first));
memset(vis,false,sizeof(vis));
e=;ans=;
for(i=;i<n;i++)
{
p[i].id=i;
scanf("%d%d",&p[i].x,&p[i].y);
q[i].x=p[i].x;q[i].y=p[i].y;
q[i].l=-;
}
for(i=;i<n;i++)
set[i]=i;
sort(p,p+n,cmp1);//按x从小到大排序
for(i=;i<n;i++)
{
if(p[i].x==p[i-].x)
{
link(p[i].id,p[i-].id);
link(p[i-].id,p[i].id);
UN(p[i].id,p[i-].id);
}
}
sort(p,p+n,cmp2);
for(i=;i<n;i++)
{
if(p[i].y==p[i-].y)
{
link(p[i].id,p[i-].id);
link(p[i-].id,p[i].id);
UN(p[i].id,p[i-].id);
}
}
for(i=;i<n;i++)
{
if(set[i]==i)
lef[ans++]=i;
}
cout<<ans<<endl;
for(i=;i<ans;i++)
{
vis[lef[i]]=true;
solve(lef[i]);
}
// cout<<e<<endl;
} return ;
}
ZOJ 3761 Easy billiards 月赛E DFS的更多相关文章
- ZOJ - 3761 Easy billiards 【并查集+DFS】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761 题意 在一个桌面上,给出一些球 如果在A球的某个方向的前方 ...
- UVALive 3486/zoj 2615 Cells(栈模拟dfs)
这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...
- POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)
题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...
- ZOJ 1457 Prime Ring Problem(dfs+剪枝)
Prime Ring Problem Time Limit: 10 Seconds Memory Limit: 32768 KB A ring is compose of n circ ...
- ZOJ 2475 Benny's Compiler(dfs判断有向图给定点有没有参与构成环)
B - Benny's Compiler Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- ZOJ 3802 Easy 2048 Again 状态DP
zoj 上次的月赛题,相当牛的题目啊,根本想不到是状态压缩好吧 有个预先要知道的,即500个16相加那也是不会超过8192,即,合并最多合并到4096,只有2的12次方 所以用状态压缩表示前面有的序列 ...
- 福州月赛2057 DFS
题意:告诉你族谱,然后Q条查询s和t的关系,妈妈输出M,爸爸输出F: 题目地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78233# ...
随机推荐
- 深入理解shared pool共享池之library cache的library cache lock系列四
本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见: 深入理解shared pool共享池之library cache的library ca ...
- iOS SDwebImage 使用说明
SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...
- list集合练习一
package com.java.c.domain; public class Person { private String name; private int age; public Person ...
- HDU 3006 The Number of set(位运算 状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...
- C语言中short的意思
short和int等一样,是C或C++的一种内部数据类型.用于表示有符号整数.不同的是,他们在内存中所占的空间大小不同,short通常为int所占一半,也有一些实现为和int一样,但不会比int大.所 ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- clipboard让复制的文本换行
https://clipboardjs.com/dist/clipboard.min.js 用clipboard实现复制时, 想让复制的文本换行, 有两咱方法: 第一种, HTML实现: <!- ...
- Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件
一.安装,从官网上下载安装,安装基本一直点击下一步就行.注意:node.js基于Python的,安装node.js之前电脑上要安装Python,最好是Python2.7或2.6. 二.cmd进入命令行 ...
- php批量发送短信或邮件的方案
最近遇到在开发中遇到一个场景,后台管理员批量审核用户时候,需要给用户发送审核通过信息,有人可能会想到用foreach循环发送,一般的短信接口都有调用频率,循环发送,肯定会导致部分信息发送失败,有人说用 ...
- 实现Word的列表样式
1.创建列表,但是不要求在文档视图中显示的层级列表 1)首先是要先把层级建立好,然后选中要编号文字.开始->段落->多级列表,选择一个列表样式,会默认所有的编号文字都是一级: 2)选择&q ...