nyist 78 圈水池

http://acm.nyist.net/JudgeOnline/problem.php?pid=78php

圈水池

時間限制: 3000 ms  |  內存限制:65535 KB
難度: 4
 
描述
有一個牧場,牧場上有不少個供水裝置,如今牧場的主人想要用籬笆把這些供水裝置圈起來,以防止不是本身的牲畜來喝水,各個水池都標有各自的座標,如今要你寫一個程序利用最短的籬笆將這些供水裝置圈起來!(籬笆足夠多,而且長度可變)
 
輸入
第一行輸入的是N,表明用N組測試數據(1<=N<=10)
第二行輸入的是m,表明本組測試數據共有m個供水裝置(3<=m<=100)
接下來m行表明的是各個供水裝置的橫縱座標
輸出
輸出各個籬笆通過各個供水裝置的座標點,而且按照x軸座標值從小到大輸出,若是x軸座標值相同,再安照y軸座標值從小到大輸出
樣例輸入
1
4
0 0
1 1
2 3
3 0
樣例輸出
0 0
2 3
3 0

 

 

分析:算法

凸包。測試

 

 

AC代碼:spa

 

 1 // NYOJ 78 -- 圈水池 Andrew 凸包算法 O(nlogn)
 2 // 將凸包的頂點按 從小到大 先x後y的 順序輸出
 3 //
 4 /*test data
 5 9 100
 6 200 400
 7 300 400
 8 300 300
 9 400 300
10 400 400
11 500 400
12 500 200
13 350 200
14 200 200
15     == 1628
16 
17 */
18 
19 #include <cstdio>
20 #include <cmath>
21 #include <algorithm>
22 using namespace std;
23 
24 const int MAXP = 1010;
25 const double Pzero = 0.00001; 
26 
27 struct POINT{
28     int x,y;
29 }p[MAXP],CHp[MAXP*2];
30 
31 double XJ(POINT a, POINT b, POINT c){
32     // vector a->b (b.x-a.x, b.y-a.y)
33     // vector a->c (c.x-a.x, c.y-a.y)
34     return (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y);
35 }
36 
37 bool comp(POINT a,POINT b){
38     return (a.x < b.x) || ((a.x==b.x) && (a.y<b.y));
39 }
40 
41 int AndrewConvexHull(POINT *CHp, int n){
42     // 計算凸包 CHp[] 逆時針存點 
43     sort(p, p + n, comp);
44     int nCHp = 0;
45     for (int i = 0 ; i < n ; CHp[nCHp++] = p[i++])
46         while(nCHp >= 2 && XJ(CHp[nCHp-2], CHp[nCHp-1], p[i]) <= 0)
47             nCHp--;
48     for (int i = n - 1,m = nCHp + 1 ; i >= 0 ; CHp[nCHp++] = p[i--])
49         while(nCHp >= m && XJ(CHp[nCHp-2], CHp[nCHp-1], p[i]) <= 0)
50             nCHp--;
51     return --nCHp;
52 }
53 
54 void init(int n){
55     // 輸入
56     for (int i = 0 ; i < n; i++)
57         scanf("%d%d", &p[i].x, &p[i].y);
58 }
59 
60 void Output(int nCHp){
61     sort(CHp, CHp + nCHp, comp);
62     for (int i = 0; i < nCHp ; i++){
63         printf("%d %d\n", CHp[i].x, CHp[i].y);
64     }
65 }
66 
67 int main()
68 {
69 //    freopen("in.txt","r",stdin);
70     int n;scanf("%d",&n);
71     while(~scanf("%d",&n) ){
72 
73         init(n);
74         int nCHp = AndrewConvexHull(CHp, n);
75         Output(nCHp);
76     }
77     return 0;
78 }
相關文章
相關標籤/搜索