將所有點按照x為first址儒,y為second從小到大排序莲趣,(可以先刪除相同點)得到p數組饱溢,將p1p2放到凸包中绩郎,從p3開始為左則加入肋杖,為右則刪到為左,最后到最右邊的點彼念,求得下凸包,再反向一個上凸包哲思。
//輸入點數組p棚赔,個數為n靠益,輸出點數組res,函數返回凸包頂點數
//輸入時先去除重復點(有需要時不去)
//若是不希望邊上有兩個以上的點(輸入點)胧后,則將<=改為<
//精度要求高時用dcmp比較
int andrew()
{
sort(p,p+n);
int m=0;
for (int i=0;i<n;i++)
{
while (m>1&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
res[m++]=p[i];
}
int k=m;
for (int i=n-2;i>=0;--i)
{
while (m>k&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
res[m++]=p[i];
}
if (m>1) --m;
return m;
}