ZOJ 3761 Easy billiards (DFS性质)

原创 2015年07月10日 08:57:51

题意  桌上有n个球  a球撞击b球时  a球停在b球位置  b球保持a球运动   若b球前面再没有球  b球就会掉下桌子  给你n个球的坐标  你可以多次选择某个撞击方向前面还有球的球撞击  问最后桌上至少还剩多少球  并输出你的撞击过程

可以把x坐标或y坐标相同的点当作是连通的 因为可以通过撞击一个球使另一个球掉下桌面

那么容易发现  一个连通块内的m个球总可以经过m-1次撞击后变成只剩一个球  这个球可以是当前连通块中的任意一个  有多少个连通块最后就最少剩下多少球  然后就可以通过一次dfs解决问题   这里利用了dfs的性质  在搜索树中子节点的球总可以通过一次朝父节点撞击使自己位置没有球  撞击方向只用比较坐标就行了  然后从叶子到根输出就行了

#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
int x[N], y[N], vis[N];
int dir[N], p[N], n, m;

void dfs(int i)
{
    vis[i] = 1;
    for(int j = 0; j < n; ++j)
    {
        if(!vis[j] && (x[j] == x[i] || y[j] == y[i]))
        {
            dfs(j);    //j和i属于一个连通块且j还没被访问 对j深搜
            if(x[j] == x[i])  //记录路径 上下左右分别用0,1,2,3表示
                dir[j] = y[j] < y[i] ? 0 : 1;
            else dir[j] = x[j] < x[i] ? 3 : 2;
            p[m++] = j;
        }
    }
}

int main()
{
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < n; ++i)
            scanf("%d%d", &x[i], &y[i]);

        memset(vis, 0, sizeof(vis));
        int cnt = m = 0;
        for(int i = 0; i < n; ++i)
            if(!vis[i]) ++cnt, dfs(i);

        printf("%d\n", cnt);
        char sdir[][10] = {"UP", "DOWN", "LEFT", "RIGHT"};
        for(int i = 0; i < m; ++i)
        {
            int j = p[i];
            printf("(%d, %d) %s\n", x[j], y[j], sdir[dir[j]]);
        }
    }

    return 0;
}
//Last modified :   2015-07-10 08:26
Easy billiards

Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge

Edward think a game of billiards is too long and boring. So he invented a new game called Easy billiards.

Easy billiards has N balls on a brimless rectangular table in the beginning, and your goal is try to make the number of balls on the table as least as possible by several hit under the following rules:

1: The direction you hit the balls should parallel to the tables border.

2: If ball A crashed into ball B, ball B will moves in the same direction of ball A before the crashing, and ball A will stop in the place of ball B before the crashing.

3: If ball C is moving and there are no balls in front of ball C, it will runs out of the tables border, that means ball C is out of the table.

4: You can choose arbitrary ball on the table to hit, but on a hit, you can't let the ball you choose to hit runs out of the tables border. In another word, a ball could runs out of the table if and only if it was crashed by another ball in a hitting.

Now, Edward wants to know the least number of balls remained on the table after several hits, and how.

Input

There are multiple test cases. For each test cases, in the first line, there is an integer N, which means the number of the balls on the table. There are following N lines, each line contains two integers Xi and Yi, which means the coordinate of ball I. (0<=N<=2000, 0<=XiYi<=10^8)

Output

For each test cases, you should output the least number of balls on the first line. And you should output several lines to show the order of hits following the first line, each line should contains the coordinate of the ball you choose to hit and the direction you hit. (LEFT,RIGHT,UP,DOWN).

Sample Input

4
0 0
2 0
4 0
2 2
9
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3

Sample output

1
(2, 2) DOWN
(4, 0) LEFT
(2, 0) LEFT
1
(1, 3) DOWN
(1, 2) DOWN
(2, 3) DOWN
(2, 2) DOWN
(3, 3) DOWN
(3, 2) DOWN
(3, 1) LEFT
(2, 1) LEFT



版权声明:本文为博主原创文章,未经博主允许不得转载。

ZOJ 3761 —— Easy billiards(并查集+深搜)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761 桌面上有N个球,每次可以使某个球向上,下,左,右四个方向运动,...
  • hongrock
  • hongrock
  • 2014年03月02日 18:41
  • 646

ZOJ 3761 Easy billiards(并查集+树遍历)

E - Easy billiards Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Su...
  • u010527492
  • u010527492
  • 2014年04月01日 10:33
  • 469

ZOJ 3761 —— Easy billiards(并查集+深搜)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761桌面上有N个球,每次可以使某个球向上,下,左,右四个方向运动,但...
  • Davenny
  • Davenny
  • 2017年08月07日 14:01
  • 121

dfs序基本类型总结

大致看了下dfs序的题型,大致清楚了大致的解题思路。。。但是对于一些题目还是比较无力。。。。 dfs序比较重要的性质:一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题 题型一:...
  • qwe2434127
  • qwe2434127
  • 2015年11月13日 16:38
  • 2877

【DFS序的常见问题】

大致看了下dfs序的题型,大致清楚了大致的解题思路。。。但是对于一些题目还是比较无力。。。。 dfs序比较重要的性质:一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题 ...
  • Star_Weeper
  • Star_Weeper
  • 2016年11月10日 20:23
  • 220

树 DFS序 详解[完全版]

本文是博主通过几篇比较好的博文组合而成。下面是几篇博文的原地址: http://cdnnn.07net01.com/2015/08/899785.html http://blog.csdn.net...
  • qq_39670434
  • qq_39670434
  • 2017年11月02日 15:06
  • 147

dfs序的常见用法整理

dfs序就是一棵树在dfs遍历时组成的节点序列. 它有这样一个特点:一棵子树的dfs序是一个区间. 下面是dfs序的基本代码: void dfs(int x,int pre,int d){//L,R表...
  • LIN452
  • LIN452
  • 2016年06月27日 21:32
  • 2128

DFS IDFS 离散傅里叶级数

DFS IDFS  离散傅里叶级数
  • wangming520liwei
  • wangming520liwei
  • 2014年06月24日 20:37
  • 1961

ZOJ - 3496 Assignment 上下界最大流+二分

题目链接点这里 毒瘤题,,wa了无数发,,,才发现当m==0的时候,,会输出一些奇怪的东西。。。 以后,,不管什么题都要记得特判,,恩,,,不然会死的很惨。。 #include #inc...
  • qq_30927651
  • qq_30927651
  • 2017年03月31日 23:04
  • 193

ZOJ2838【LCA在线查询】

模板题。 推荐博文:点我打开链接 博主再啰嗦几句: 储存遍历序列的数组ver[ ]; 每个结点第一次出现的位置的数组 First[ ]; 当前位置的深度的数组 deep[ ]   ...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017年04月08日 21:42
  • 433
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ 3761 Easy billiards (DFS性质)
举报原因:
原因补充:

(最多只允许输入30个字)