• 18.12.25 POJ 1228 Grandpa's Estate


    描述

    Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one was a piece of convex polygon shaped farm in the grandpa's birth village. The farm was originally separated from the neighboring farms by a thick rope hooked to some spikes (big nails) placed on the boundary of the polygon. But, when Kamran went to visit his farm, he noticed that the rope and some spikes are missing. Your task is to write a program to help Kamran decide whether the boundary of his farm can be exactly determined only by the remaining spikes.输入The first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains an integer n (1 <= n <= 1000) which is the number of remaining spikes. Next, there are n lines, one line per spike, each containing a pair of integers which are x and y coordinates of the spike.

    输出

    There should be one output line per test case containing YES or NO depending on whether the boundary of the farm can be uniquely determined from the input.

    样例输入

    1
    6 
    0 0
    1 2
    3 4
    2 0
    2 4 
    5 0
    

    样例输出

    NO

    来源

    Tehran 2002 Preliminery

    题解

      1 #include <iostream>
      2 #include <string.h>
      3 #include <algorithm>
      4 #include <stack>
      5 #include <string>
      6 #include <math.h>
      7 #include <queue>
      8 #include <stdio.h>
      9 #include <string.h>
     10 #include <set>
     11 #include <vector>
     12 #define maxn 1005
     13 #define inf 999999
     14 using namespace std;
     15 
     16 int n;
     17 struct node {
     18     int x, y, idx;
     19 }spike[maxn];
     20 bool operator <(node a, node b) {
     21     if (a.x == b.x)
     22         return a.y < b.y;
     23     return a.x < b.x;
     24 }
     25 int bao[maxn], c = 0;
     26 bool in[maxn];
     27 bool vis[maxn];
     28 
     29 void solve() {
     30     deque<node>all;
     31     all.push_back(spike[1]), all.push_back(spike[2]);
     32     for (int i = 3; i <= n; i++) {
     33         while (1) {
     34             int size = all.size();
     35             if (size <= 1) {
     36                 all.push_back(spike[i]);
     37                 break;
     38             }
     39             node t = all[size-1],u = all[size-2];
     40             node ut, ta;
     41             ut.x = t.x - u.x; ut.y = t.y - u.y;
     42             ta.x = spike[i].x - t.x; ta.y = spike[i].y - t.y;
     43             int tmp = ut.x*ta.y - ut.y*ta.x;
     44             if (tmp < 0) {
     45                 in[all.back().idx] = false;
     46                 all.pop_back();
     47             }
     48             else {
     49                 if (tmp == 0)
     50                     in[all.back().idx] = true;
     51                 all.push_back(spike[i]);
     52                 break;
     53             }
     54         }
     55     }
     56     while (!all.empty()) {
     57         bao[++c] = all.front().idx;
     58         vis[bao[c]] = true;
     59         all.pop_front();
     60     }
     61     for (int i = 1; i <= c-1; i++) {
     62         if (in[bao[i]] ==false&& in[bao[i + 1]]==false) {
     63             printf("NO
    ");
     64             return;
     65         }
     66     }
     67     all.push_back(spike[n]), all.push_back(spike[n-1]);
     68     for (int i = n-2; i >= 1; i--) {
     69         while (1) {
     70             int size = all.size();
     71             if (size <= 1) {
     72                 all.push_back(spike[i]);
     73                 break;
     74             }
     75             node t = all[size - 1], u = all[size - 2];
     76             node ut, ta;
     77             ut.x = t.x - u.x; ut.y = t.y - u.y;
     78             ta.x = spike[i].x - t.x; ta.y = spike[i].y - t.y;
     79             int tmp = ut.x*ta.y - ut.y*ta.x;
     80             if (tmp < 0) {
     81                 in[all.back().idx] = false;
     82                 all.pop_back();
     83             }
     84             else {
     85                 if (tmp == 0)
     86                     in[all.back().idx] = true;
     87                 all.push_back(spike[i]);
     88                 break;
     89             }
     90         }
     91     }
     92     all.pop_front();
     93     c = 0;
     94     while (!all.empty()) {
     95         bao[++c] = all.front().idx;
     96         all.pop_front();
     97         if (vis[bao[c]]&&!all.empty()) {
     98             printf("NO
    ");
     99             return;
    100         }
    101     }
    102     for (int i = 1; i <= c-1; i++) {
    103         if (in[bao[i]] ==false&& in[bao[i + 1]]==false) {
    104             printf("NO
    ");
    105             return;
    106         }
    107     }
    108     printf("YES
    ");
    109 }
    110 
    111 void init() {
    112     scanf("%d", &n);
    113     memset(in, 0, sizeof(in));
    114     memset(vis, 0, sizeof(vis));
    115     c = 0;
    116     for (int i = 1; i <= n; i++) {
    117         scanf("%d%d", &spike[i].x, &spike[i].y);
    118         spike[i].idx = i;
    119     }
    120     sort(spike + 1, spike + 1 + n);
    121     solve();
    122 }
    123 
    124 int main() {
    125     int kase;
    126     scanf("%d", &kase);
    127     while(kase--)
    128         init();
    129     return 0;
    130 }
    View Code

    做这题的时候我还觉得计算几何没什么大不了的……

    直到我看到了后两道……

    我不该在课上做其他科作业的……

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    oracle 锁表查看与解锁
    oracle 监视索引是否使用
    oracle 查看数据库版本
    mybatis 中文做参数报错
    windows mysql绿色版配置
    maven使用本地jar包
    Java 使用Jedis连接Redis数据库(-)
    Linux 安装redis
    ELK之在CentOS7.5上使用rpm包安装配置ELK7版本
    Ubuntu-18.04更改安装源为国内源
  • 原文地址:https://www.cnblogs.com/yalphait/p/10174838.html
Copyright © 2020-2023  润新知