ZOJ 3761 Easy billiards (DFS性质)
来源:互联网 发布:淘宝网店创业计划书 编辑:程序博客网 时间:2024/05/01 04:04
题意 桌上有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
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<=Xi, Yi<=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
40 02 04 02 291 12 13 11 22 23 21 32 33 3
Sample output
1(2, 2) DOWN(4, 0) LEFT(2, 0) LEFT1(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 (DFS性质)
- ZOJ 3761 Easy billiards[dfs]
- Zoj 3761 Easy billiards dfs
- zoj 3761 Easy billiards(dfs搜索树)
- zoj 3761 Easy billiards(建图+贪心+dfs)
- [贪心+dfs] ZOJ 3761 Easy billiards
- zoj 3761 Easy billiards
- zoj 3761 Easy billiards
- zoj 3761 Easy billiards 并查集+dfs
- Easy billiards (zoj 3761 并查集+DFS)
- zoj 3761 Easy billiards 乱搞
- ZOJ 3761——Easy billiards(DFS,并查集)
- ZOJ 3761 Easy billiards(并查集+树遍历)
- Easy billiards
- ZOJ 3761 —— Easy billiards(并查集+深搜)
- ZOJ 3761 —— Easy billiards(并查集+深搜)
- ZOJ 3764 Easy billiards 月赛E题
- zoj3761 Easy billiards
- 笔试 - 洗牌算法
- Java通过JNI调用C++程序
- kafka 学习笔记(二)之Java Producer客户端
- Google 镜像站搜集
- 曹娥做系统是如何感知事件的???
- ZOJ 3761 Easy billiards (DFS性质)
- 黑马程序员-java基础IO流(2)
- 黑马程序员 面向对象 单例设计模式
- 黑马程序员 面向对象 继承 抽象
- 黑马程序员 面向对象 接口
- C++指针学习
- inheritance & class variable DEMO
- 黑马程序员 面向对象 多态 需求 object
- scala 入门