zoj 3761 Easy billiards 乱搞
来源:互联网 发布:遥感图像元数据 编辑:程序博客网 时间:2024/05/21 17:43
题目大意:二维平面(桌面)上有n个球。你可以选一个球,击动它,使它向水平轴方向滚动(即4个方向)。当一个球a碰到球a1时,球a停止在球a1的位置,而球a1向球a停止前的方向继续滚动。但是,你不是能随便击球的,你打击一个球,必须使得它能碰撞另一个球,否则,你不能对这个球进行这个方向的打击。当一个球滚向了无限远处,就认为他离开了桌面。求,若干次打击后,桌面上最少有几个球?并输出一个可行的方案。
将球看做点,相邻的点之间建一条边,构成图。随意找一个点,dfs搜一次。对于这棵树而言,从叶子开始,每次都将其向父亲节点的方向打击,最后是一定能够使得只有根那个位置才有球的。而且,显然,这么做是满足最小的。
//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)//typedef __int64 LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=1000111222;const double INFF=1e200;const double eps=1e-8;const int mod=1000000007;const int NN=2010;const int MM=100010;/* ****************** */int x[NN],y[NN];struct G{ int v,next;}E[NN*4*2];int p[NN],T;bool vis[NN];struct OP{ int x,y; char ss[10];}ans[NN];int cnt;struct node{ int x,y,id;}aa[NN];void add(int u,int v){ E[T].v=v; E[T].next=p[u]; p[u]=T++;}//(LEFT,RIGHT,UP,DOWN).char str[4][10]={"LEFT","RIGHT","UP","DOWN",};int goo(int x,int y,int x1,int y1){ if(y==y1) { if(x<x1) return 1; return 0; } else { if(y<y1) return 2; return 3; }}void dfs(int u,int fa){ int i,v; for(i=p[u];i+1;i=E[i].next) { v=E[i].v; if(!vis[v]) { vis[v]=true; dfs(v,u); } } if(fa!=-1) { ans[cnt].x=x[u]; ans[cnt].y=y[u]; int t=goo(x[u],y[u],x[fa],y[fa]); strcpy(ans[cnt].ss,str[t]); cnt++; }}void solve(int n){ int i; memset(vis,false,sizeof(vis)); cnt=0; for(i=1;i<=n;i++) { if(!vis[i]) { vis[i]=true; dfs(i,-1); } } printf("%d\n",n-cnt); for(i=0;i<cnt;i++) { printf("(%d, %d) %s\n",ans[i].x,ans[i].y,ans[i].ss); }}bool cmp1(node t1,node t2){ if(t1.x==t2.x) return t1.y<t2.y; return t1.x<t2.x;}bool cmp2(node t1,node t2){ if(t1.y==t2.y) return t1.x<t2.x; return t1.y<t2.y;}int main(){ int n,i; while(scanf("%d",&n)!=EOF) { memset(p,-1,sizeof(p)); T=0; for(i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); aa[i].x=x[i]; aa[i].y=y[i]; aa[i].id=i; } sort(aa+1,aa+1+n,cmp1); for(i=1;i<n;i++) { if(aa[i].x==aa[i+1].x) { add(aa[i].id,aa[i+1].id); add(aa[i+1].id,aa[i].id); } } sort(aa+1,aa+1+n,cmp2); for(i=1;i<n;i++) { if(aa[i].y==aa[i+1].y) { add(aa[i].id,aa[i+1].id); add(aa[i+1].id,aa[i].id); } } solve(n); } return 0;}
0 0
- zoj 3761 Easy billiards 乱搞
- zoj 3761 Easy billiards
- zoj 3761 Easy billiards
- 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 (DFS性质)
- zoj 3761 Easy billiards 并查集+dfs
- ZOJ 3761 Easy billiards(并查集+树遍历)
- Easy billiards (zoj 3761 并查集+DFS)
- Easy billiards
- ZOJ 3761 —— Easy billiards(并查集+深搜)
- ZOJ 3761——Easy billiards(DFS,并查集)
- ZOJ 3761 —— Easy billiards(并查集+深搜)
- ZOJ 3764 Easy billiards 月赛E题
- zoj3761 Easy billiards
- Android开发文章推荐
- 【FJOI2007】轮状病毒
- 通过手机号码怎么知道别人的所在位置
- 防止 _com_util::ConvertBSTRToString 引发的内存泄漏
- python 基于Tkinter的姻缘测试器
- zoj 3761 Easy billiards 乱搞
- 2014来了
- tnsnames.ora配置
- 关于_com_util::ConvertBSTRToString”: 编译错误问题
- 实现阿拉伯数字变成中文大写
- lsof 结合 while 和 read 循环 kill 某个端口上的进程的小程序
- 8 gdb tricks you should know
- .properties文件保存汉字失败
- 取消IE“已限制此网页运行可以访问计算机的脚本