POJ 1696 Space Ant 類卷包裹法

2021-06-21 16:53:46 字數 1527 閱讀 2922

在紙上畫畫能發現不管給出的是怎麼的一些點,都是可以按照一定方式並且遵循規則走完的。

這個方式就是卷包裹了,和一般的卷包裹法的區別是這個題是不走重複點的,所以需要加乙個vis陣列。而捲包裹是需要走到起點的,所以要允許走重複點。

關於卷包裹法這個部落格寫的很好:

#include #include #include #include using namespace std;

const double eps = 1e-10;

const int max_n = 50 + 10;

struct point

};typedef point vector;

vector operator + (const vector& a, const vector& b)

vector operator - (const point& a, const point& b)

vector operator * (const vector& a, double p)

bool operator < (const point& a, const point& b)

int dcmp(double x)

bool operator == (const point& a, const point &b)

double cross(const vector& a, const vector& b)

double dot(const vector& a, const vector& b)

double length(const vector& a)

struct path

;path path[max_n];

int vis[max_n], _output[max_n];

int main()

}_output[_size++] = path[_start].index;

vis[path[_start].index] = 1;

_beg = _start;

bool flag = true;

while(_size < n)

if(dcmp(cross(path[i].p - path[_beg].p, path[_end].p - path[_beg].p)) > 0)

_end = i;

else if(dcmp(cross(path[i].p - path[_beg].p, path[_end].p - path[_beg].p)) == 0)

}_output[_size++] = path[_end].index;

_beg = _end;

vis[path[_end].index] = 1;

}printf("%d ", _size);

for(int i = 0; i < _size - 1; i++)

printf("%d ", _output[i]);

printf("%d\n", _output[_size - 1]);

}return 0;

}

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...