zoukankan      html  css  js  c++  java
  • X

     Urban Elevations 

    An elevation of a collection of buildings is an orthogonal projection of the buildings onto a vertical plane. An external elevation of a city would show the skyline and the faces of the ``visible" buildings of the city as viewed from outside the city from a certain direction. A southern elevation shows no sides; it shows the perfectly rectangular faces of buildings or parts of faces of buildings not obstructed on the south by taller buildings. For this problem, you must write a program that determines which buildings of a city are visible in a southern elevation.

    For simplicity, assume all the buildings for the elevation are perfect rectangular solids, each with two sides that run directly east-west and two running directly north-south. Your program will find the buildings that appear in a southern elevation based on knowing the positions and heights of each city building. That data can be illustrated by a map of the city as in the diagram on the left below. The southern elevation for that city is illustrated in the diagram on the right.

    (The shadow buildings are visible in a southern elevation)

    Input

    Input for your program consists of the numeric description of maps of several cities. The first line of each map contains the number of buildings in the city (a non-negative integer less than 101). Each subsequent line of a map contains data for a single building - 5 real numbers separated by spaces in the following order:

    x-coordinate of the southwest corner

    y-coordinate of the southwest corner

    width of the building (length of the south side)

    depth of the building (length of the west side)

    height of the building

    Each map is oriented on a rectangular coordinate system so that the positive x-axis points east and the positive y-axis points north. Assume that all input for each map corresponds to a legitimate map (the number of buildings is the same as the number of subsequent lines of input for the map; no two buildings in a single map overlap). Input is terminated by the number 0 representing a map with no buildings.

    Output

    Buildings are numbered according to where their data lines appear in the map's input data - building #1 corresponding to the first line of building data, building #2 data to the next line, and building #n to the nth line of building data for that map. (Buildings on subsequent maps also begin their numbering with 1.)

    For each map, output begins with line identifying the map (map #1, map #2, etc.) On the next line the numbers of the visible buildings as they appear in the southern elevation, ordered south-to-north, west-to-east. This means that if building n and building m are visible buildings and if the southwest corner of building n is west of the southwest corner of building m, then number n is printed before number m. If building n and building m have the same x-coordinate for their southwest corners and if building n is south of building m, then the number n is printed before the number m.

    For this program, a building is considered visible whenever the part of its southern face that appears in the elevation has strictly positive area. One blank line must separate output from consecutive input records.

    Sample Input

    14
    160 0 30 60 30
    125 0 32 28 60
    95 0 27 28 40
    70 35 19 55 90
    0 0 60 35 80
    0 40 29 20 60
    35 40 25 45 80
    0 67 25 20 50
    0 92 90 20 80
    95 38 55 12 50
    95 60 60 13 30
    95 80 45 25 50
    165 65 15 15 25
    165 85 10 15 35
    0

    Sample Output

    For map #1, the visible buildings are numbered as follows:
    5 9 4 3 10 2 1 14

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <string>
     7 #include <vector>
     8 #include <set>
     9 #include <map>
    10 #include <queue>
    11 #include <stack>
    12 #include <sstream>
    13 #include <cctype>
    14 #include <utility>
    15 using namespace std;
    16 const int INF = 0x7fffffff;
    17 const double EXP = 1e-8;
    18 const int MAX=105;
    19 struct build
    20 {
    21     int id;
    22     double x,y,w,d,h;
    23     bool operator < (const build &b) const
    24     {
    25         return x<b.x||(x==b.x&&y<b.y);
    26     }
    27 }b[MAX];
    28 int n;
    29 double x[MAX*2];  //坐标轴上的点
    30 bool cover(int i,double mx)  //判断build——i是否在包含mx的区间
    31 {
    32     return b[i].x<=mx&&mx<=b[i].x+b[i].w;
    33 }
    34 bool visible(int i,double mx)
    35 {
    36     if(!cover(i,mx))    //不在包含mx的区间
    37         return false;
    38     for(int j=0;j<n;j++)
    39         if(b[j].y<b[i].y&&b[j].h>=b[i].h&&cover(j,mx))
    40             return false;   //j覆盖i
    41     return true;
    42 }
    43 
    44 int main()
    45 {
    46     int kase=0;
    47     while(cin>>n&&n)
    48     {
    49         for(int i=0;i<n;i++)
    50         {
    51             cin>>b[i].x>>b[i].y>>b[i].w>>b[i].d>>b[i].h;
    52             x[i*2]=b[i].x;
    53             x[i*2+1]=b[i].x+b[i].w;
    54             b[i].id=i+1;
    55         }
    56         sort(b,b+n);
    57         sort(x,x+2*n);
    58         int m=unique(x,x+2*n)-x;   //  x.erase(m,x.end())
    59         if(kase++)
    60             cout<<endl;
    61         cout<<"For map #"<<kase<<", the visible buildings are numbered as follows:"<<endl;
    62         cout<<b[0].id;
    63         for(int i=1;i<n;i++)
    64         {
    65             bool vis=false;
    66             for(int j=0;j<m-1;j++)
    67             {
    68                 if(visible(i,(x[j]+x[j+1])/2))
    69                 {
    70                     vis=true;
    71                     break;
    72                 }
    73             }
    74             if(vis)
    75                 cout<<" "<<b[i].id;
    76         }
    77         cout<<endl;
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    delphi SysErrorMessage 函数和系统错误信息表 good
    Delphi中ShellExecute使用详解(详细解释10种显示状态)
    几个获取Windows系统信息的Delphi程序
    判断操作系统多久没有任何操作
    MVC4+WebApi+Redis Session共享练习(下)
    MVC4+WebApi+Redis Session共享练习(上)
    EntityFramework使用总结(与MVC4.0实现CURD操作)
    MVC3.0+knockout.js+Ajax 实现简单的增删改查
    基于Redis缓存的Session共享(附源码)
    Redis缓存服务搭建及实现数据读写
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4259808.html
Copyright © 2011-2022 走看看