题目链接: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的更多相关文章

  1. ZOJ - 3761 Easy billiards 【并查集+DFS】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761 题意 在一个桌面上,给出一些球 如果在A球的某个方向的前方 ...

  2. UVALive 3486/zoj 2615 Cells(栈模拟dfs)

    这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...

  3. POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)

    题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...

  4. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  5. ZOJ 1457 Prime Ring Problem(dfs+剪枝)

     Prime Ring Problem Time Limit: 10 Seconds      Memory Limit: 32768 KB A ring is compose of n circ ...

  6. ZOJ 2475 Benny's Compiler(dfs判断有向图给定点有没有参与构成环)

    B - Benny's Compiler Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu ...

  7. ZOJ 1609 Equivalence(状压+dfs减枝)

    ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds      Memory Limit: 32768 KB When learning m ...

  8. ZOJ 3802 Easy 2048 Again 状态DP

    zoj 上次的月赛题,相当牛的题目啊,根本想不到是状态压缩好吧 有个预先要知道的,即500个16相加那也是不会超过8192,即,合并最多合并到4096,只有2的12次方 所以用状态压缩表示前面有的序列 ...

  9. 福州月赛2057 DFS

    题意:告诉你族谱,然后Q条查询s和t的关系,妈妈输出M,爸爸输出F: 题目地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78233# ...

随机推荐

  1. DropDownList绑定多个字段值

    发觉这个问题还是挺多人问的,简单写几个例子: 假设现有1张表名为:XUDAXIA  , 该表里有2个字段:  NAME , GENDER 达到效果: 将这2个字段绑定到DropDownList的Lis ...

  2. while loading persisted sessions 异常解决方法

    一直用tomcat一段时间都正常无事,最近一次启动tomcat就发生以下异常: 严重: IOException while loading persisted sessions: java.io.EO ...

  3. Eclipse快捷键,前几个很实用

    F3 :查看实现 F4(或control + T) :继承树 control + F6 :切换文件 control + F7 :切换视图 control + F8 :切换模板 control + O ...

  4. Object-C 类实现

    这篇为Object-C添加方法的后续. 这里我们应该在类的实现(.m)文件中写 #import "Photo.h" @implementation Photo - (NSStrin ...

  5. 小白偶遇Sublime Text 3

    sublime text3号称神一样的编辑器,主要归功于它丰富的插件所带来的可扩展性.以前曾经抱着玩一玩的心态下载了sublime ,没有插件的sublime 很快被我扔到一边.在用过很多的编辑器后, ...

  6. FXBlurView用法

    FXBlurView是UIView的子类,它实现毛玻璃效果的原理其实就是覆盖上一层FXBlurView的实例对象. - (void)viewDidLoad { [super viewDidLoad]; ...

  7. jQuery 事件 方法

    jQuery 事件方法 事件方法触发器或添加一个函数到被选元素的事件处理程序. 下面的表格列出了所有用于处理事件的 jQuery 方法. 方法 描述 bind() 向元素添加事件处理程序 blur() ...

  8. Java小例子(学习整理)-----学生管理系统-控制台版

    1.功能介绍: 首先,这个小案例没有使用数据库,用集合的形式暂时保存数据,做测试! 功能: 增加学生信息 删除学生信息 修改学生信息 查询学生信息:  按照学号(精确查询)  按照姓名(模糊查询) 打 ...

  9. 数据库(学习整理)----2--关于Oracle用户权限的授权和收权

    知识点: 1.Oracle数据库中所用的用户等级是平级的!只是每个用户的权限不同而已! 2.在一个用户登录后,可以在自己的登录状态下访问其他用户的数据缓冲区.表.以及表的操作!(只要该用户用权限!) ...

  10. 学渣也要搞 laravel(3)—— HTTP控制器

    1. laravel 控制器在app/Http/Controllers/ 下,你会看到里面有一个Controller.php ,之后我们创建的控制器都是继承这个总控制器的.创建控制器只需要在这里面添加 ...