圈水池 凸包入門

2021-09-07 03:27:48 字數 1650 閱讀 4436

時間限制:

3000 ms  |           記憶體限制:65535 kb

難度:4

描述

有乙個牧場,牧場上有很多個供水裝置,現在牧場的主人想要用籬笆把這些供水裝置圈起來,以防止不是自己的牲畜來喝水,各個水池都標有各自的座標,現在要你寫乙個程式利用最短的籬笆將這些供水裝置圈起來!(籬笆足夠多,並且長度可變)

輸入第一行輸入的是n,代表用n組測試資料(1<=n<=10)

第二行輸入的是m,代表本組測試資料共有m個供水裝置(3<=m<=100)

接下來m行代表的是各個供水裝置的橫縱座標

輸出輸出各個籬笆經過各個供水裝置的座標點,並且按照x軸座標值從小到大輸出,如果x軸座標值相同,再安照y軸座標值從小到大輸出

樣例輸入

1

40 0

1 12 3

3 0

樣例輸出

0 0

2 33 0

題解:用到了差積的特性,如果差積為負就是順時針轉,如果為正就是逆時針,如果為0就是共線;

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7struct

node

13};

14int

chaji(node a,node b,node c)

17 node a[110],ans[110

];18

intmain()

30int t=k;

31for(int i=m-1;i>=0;i--)

35 k--;

36 sort(ans,ans+k);

37for(int i=0;i"

%d %d\n

",ans[i].x,ans[i].y);38}

39return0;

40 }

另一種寫法:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7struct

point

10};

11typedef point vector;

12bool

operator

<(vector a,vector b)

15 vector operator - (point a,point b)

16double

cross(vector a,vector b)

19 point a[110],ans[110

];20

intmain()

32int t=k;

33for(int i=m-1;i>=0;i--)

37 k--;

38 sort(ans,ans+k);

39for(int i=0;i"

%.0lf %.0lf\n

",ans[i].x,ans[i].y);40}

41return0;

42 }

圈水池(凸包入門)

描述 有乙個牧場,牧場上有很多個供水裝置,現在牧場的主人想要用籬笆把這些供水裝置圈起來,以防止不是自己的牲畜來喝水,各個水池都標有各自的座標,現在要你寫乙個程式利用最短的籬笆將這些供水裝置圈起來!籬笆足夠多,並且長度可變 輸入 第一行輸入的是n,代表用n組測試資料 1 n 10 第二行輸入的是m,代...

凸包問題 圈水池 nyist 78

include include include using namespace std struct point int cmp1 point a,point b 按y排序 int cmp2 point a,point b 按x排序 此處是大於號 int graham point pnt,int n...

NYOJ 78 圈水池(凸包基礎)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有乙個牧場,牧場上有很多個供水裝置,現在牧場的主人想要用籬笆把這些供水裝置圈起來,以防止不是自己的牲畜來喝水,各個水池都標有各自的座標,現在要你寫乙個程式利用最短的籬笆將這些供水裝置圈起來!籬笆足夠多,並且長度可變 輸入第一行輸...