POJ 1696 Space Ant 計算幾何

2021-10-24 21:58:59 字數 3307 閱讀 5334

題意:給出一系列二維點,問從(0,y)出發,y是這些點裡縱座標的最小值,只能左轉或者直走,並且每個點只能走一次,輸出能走完這些點的路徑的順序。

題解:先找到第乙個點,它肯定是當y取最小時的那個點,然後接下來開始遍歷,每次找的點與pre連成的線都要與pre和first連成的線的夾角最小,找到後就更新first為pre,更新pre為當前的找到的點

// #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

double pi =

acos((

double)(

-1))

;#define inf 0x3f3f3f3f

#define ll long long

#define eps 1e-8

const

int maxn =60;

const

int mod =

1e9+7;

intsgn

(double x)

intdcmp

(double x,

double y)

struct point

point

(double x,

double y):x

(x),

y(y)

point operator

+(point b)

point operator

-(point b)

point operator*(

double k)

point operator/(

double k)

bool

operator

==(point b)

}p[maxn]

;typedef point vector;

//用點的資料結構定義向量

struct line

line

(point p1,point p2):p1

(p1),p2

(p2)

line

(point p,

double angle)

else

}line

(double a,

double b,

double c)

elseif(

sgn(b)==0

)else

}}l[maxn]

;bool

cmp(

const line &v1,

const line &v2)

typedef line segment;

double

dist

(point a,point b)

double

dot(vector a,vector b)

//計算向量點積,>0銳角,<0鈍角,=0直角 a·b = fabs(a)*fabs(b)*cos(angle)

double

len(vector a)

//計算向量長度

double

len2

(vector a)

//向量長度的平方

double

angle

(vector a,vector b)

//計算兩向量的夾角

double

cross

(vector a,vector b)

//計算向量叉積,叉積有正負,a×b>0(b在a的逆時針方向),b×a<0 a×b = fabs(a)*fabs(b)*sin(angle)

double

area

(vector a,vector b,vector c)

//以a為公共點的兩向量構成的平行四邊形面積

vector rotate

(vector a,

double rad)

vector normal

(vector a)

//求該向量的法向量

bool

parallel

(vector a,vector b)

//用叉積判斷兩向量是否平行或重合

intpoint_line_relation

(point p, line v)

bool

point_on_seg

(point p, line v)

double

dis_point_line

(point p, line v)

point point_line_proj

(point p, line v)

point point_line_symmetry

(point p, line v)

double

dis_point_seg

(point p, segment v)

intline_relation

(line v1, line v2)

return2;

//相交

}point cross_point

(point a, point b, point c, point d)

bool

cross_segment

(point a, point b, point c, point d)

bool

cross_segment1

(point a, point b, point c, point d)

double

helen

(double a,

double b,

double c)

int t, n, num, vis[maxn]

;int

main()

} p[0]

=;cout<" "

;int n = n;

n--;int last =0;

while

(n--)}

vis[last]=1

; first = pre;

pre = last;

cout<<

" "<} cout<}return0;

}

poj 1696 Space Ant 有關極角

題意 從最低的點開始,不能向右拐,問能經過多少點?能定是經過所有點了 從最低點開始,求與其極角最小的點,作為新的起點,在需找與這個點成極角最小的點,依次即可 include includestruct point dian 60 int n int dis point a,point b int c...

poj 1696 Space Ant 卷包裹法

首先好好研究卷包裹法的思路,發現每一plant一定是可以走到的。這篇文章寫的很好 這裡 然後就是把這些點的標號存起來啦,因為不是求點的座標,要儲存原來的標號,所以弄了乙個struct 作為對映原來的標號用。bool 陣列依舊用來表示是否已經被加入 卷包裹遍歷集合 include include in...

POj 1696 Space Ant (極角排序)

題意 乙隻螞蟻,只會向左轉,現在給出平面上很多個點,求解一種走法,能使得螞蟻能經過的點最多,每個頂點該螞蟻只能經過一次,且所行走的路線不能發生交叉.對於題目所輸入的點,先找出最左下方的頂點 即縱座標最小的頂點 然後對剩下的頂點按照對與左下點的極角排序,然後反覆找最左下的點,反覆進行極角排序,同時記錄...