hdu 4491 Windmill Animation(几何+模拟)

2014-11-24 00:12:06 · 作者: · 浏览: 4
给定平面上的n(n<=20)个点,不存在三点共线。然后每次用某条直线(原点及斜率)逆时针旋转,每碰到一个点后,更换原点跟斜率。求出前s个原点。
考虑到n很小,可以模拟来搞。每次得到一个原点及斜率,然后构造出在直线上原点(O)的上方(rp)和下方(rn)两个点。然后依次每个不在该直线上的点,如果该点在直线上方,那么要达到该点逆时针旋转的角度为向量 rp->O 和向量 p->O的夹角。反之则是向量O->rp和向量O->rn的夹角。
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#define FF(i, a, b) for(int i=a; i=b; i--)  
#define REP(i, n) for(int i=0; i
0) tang = Angle(rn-O, p[i]-O); else if(tmp < 0) tang = Angle(rp-O, p[i]-O); else tang = 0; if(dcmp(nxtang - tang) > 0) nxtang = tang, nxt = i; } ans[tot++] = nxt; ang = angle(now-p[nxt]); now = p[nxt]; id1 = id2; id2 = nxt; } printf("%d", cas); REP(i, tot) printf(" %d", ans[i]); puts(""); } return 0; }