題意:
有乙隻類似於螞蟻之類的動物,由於 他的身體缺陷只可以左轉不可右轉,每天他它都要吃乙個植物才可以活下去,如果沒有食物可以吃了他就死,給你植物的座標你要求的就是問他怎麼選擇吃食物的順序才可以使自己活得長久。
最開始他的座標在(0,y),y是所有節點中縱座標的最小值,所以第乙個食物我i們直著走過去不用轉彎就可以吃到。
思路:
因為只可以左轉不可以右轉所以我們每次吃的都應該是轉的角度最小的那個,因為只有這樣我們才可以吃到更多的食物。因為這個特性我們就像到凸包, 外面的凸包就是外面這幾個點的順序,用乙個陣列做一下標記,標記一下這個食物是否已經被吃過, 然後對沒吃過的食物繼續求凸包即可,但是在求凸包的時候應該注意的乙個點就是每一次求極角排序的的參照點應該是上乙個凸包結果的最後乙個點。
還有細節部分看一下**注釋。
g++ ac **:
#include
#include
#include
#include
#include
using namespace std;
const
double eps =
1e-8
;const
int maxn =
110;
int vis[maxn]
;int
sgn(
double x)
struct point
; point (
double _x,
double _y)
void
input()
bool operator ==
(point b)
const
double operator ^
(const point &b)
const
bool operator <
(point b)
const
point operator -
(const point &b)
const
double distance (point p)};
struct polygon
bool operator ()(
const point &aa,
const point &bb)
return d>0;
}};void
norm
(point mi)
void
graham
(polygon &convex,point k)
if(n==2)
convex.p[0]
=p[0];
convex.p[1]
=p[1];
top=2;
for(
int i=
2;i(convex.n==2&&
(convex.p[0]
==convex.p[1]
))convex.n--;}
};polygon a,ap,tempa;
intmain()
tempa.n=n;
a=tempa;
point kk = a.p[0]
;int g=0;
for(
int i=
1;i)elseif(
sgn(a.p[i]
.y-kk.y)==0
&&sgn
(a.p[i]
.x-kk.x)
<0)
}//找到第乙個食物節點。
//以此作為求解凸包的基礎。
swap
(a.p[g]
,a.p[0]
);while
(cont>0)
}}}else}}
}//準備節點左線一次凸包。
for(
int i=
0;iif(cnt1==0)
cnt1+
=ap.n;
else cnt1+
=(ap.n-1)
; a.n=cont+1;
kk=ap.p[ap.n-1]
; a.p[0]
=kk;
}printf
("%d"
,cnt1)
;for
(int i=
0;i)printf
("\n");
}return0;
}
POJ 1696 Space Ant 計算幾何
題意 給出一系列二維點,問從 0,y 出發,y是這些點裡縱座標的最小值,只能左轉或者直走,並且每個點只能走一次,輸出能走完這些點的路徑的順序。題解 先找到第乙個點,它肯定是當y取最小時的那個點,然後接下來開始遍歷,每次找的點與pre連成的線都要與pre和first連成的線的夾角最小,找到後就更新fi...
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...