UVA 221 - Urban Elevations(枚举+区间覆盖)
来源:互联网 发布:金十数据手机官网 编辑:程序博客网 时间:2024/05/21 21:34
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.
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 cornery-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 thenth 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 nis 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
14160 0 30 60 30125 0 32 28 6095 0 27 28 4070 35 19 55 900 0 60 35 800 40 29 20 6035 40 25 45 800 67 25 20 500 92 90 20 8095 38 55 12 5095 60 60 13 3095 80 45 25 50165 65 15 15 25165 85 10 15 350
Sample Output
For map #1, the visible buildings are numbered as follows:5 9 4 3 10 2 1 14
题意:给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h。问从南面看过去能看到几座房子。
思路:先枚举每个房子,把可能覆盖的房子保存下来,然后就变成一个区间覆盖问题,判断能完全覆盖的就是会被挡住。最后输出要注意要按x优先,y第二优先输出。
代码:
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int N = 105;int n;struct House {int x, y, w, h, id;} h[N], save[N];bool cmp(House a, House b) {if (a.x == b.x) return a.y < b.y;return a.x < b.x;}bool judge(House a) {int sn = 0, i;for (i = 0; i < n; i++) {House b = h[i];if (b.y >= a.y) continue;if (b.x >= a.x + a.w || b.x + b.w <= a.x) continue;if (b.h < a.h) continue;save[sn++] = b;}if (sn == 0) return true;sort(save, save + sn, cmp);int r = a.x;for (i = 0; i < sn; i++) {if (save[i].x > r) return true;r = max(r, save[i].x + save[i].w);}if (r < a.x + a.w) return true;return false;}void solve() {sort(h, h + n, cmp);int bo = 0;for (int i = 0; i < n; i++) {if (judge(h[i])) {if (bo++) printf(" ");printf("%d", h[i].id);}}printf("\n");}int main() {int cas = 0;while (~scanf("%d", &n) && n) {if (cas) printf("\n");for (int i = 0; i < n; i ++) {scanf("%d%d%d%*d%d", &h[i].x, &h[i].y, &h[i].w, &h[i].h);h[i].id = i + 1;}printf("For map #%d, the visible buildings are numbered as follows:\n", ++cas);solve();}return 0;}
- UVA 221 - Urban Elevations(枚举+区间覆盖)
- UVa 221 Urban Elevations (区间覆盖问题)
- uva 221 - Urban Elevations(暴力枚举)
- uva--221--Urban Elevations
- UVA - 221 Urban Elevations
- UVa 221 Urban Elevations
- UVa 221 Urban Elevations
- uva 221 Urban Elevations
- uva 221 Urban Elevations
- UVa 221 - Urban Elevations (离散化)
- UVA 221 Urban Elevations (离散化)
- UVA 221 Urban Elevations 离散化 模拟
- UVA 221 Urban Elevations (离散化)
- UVA 221 Urban Elevations(离散化)
- Urban Elevations UVA
- Urban Elevations UVA
- 221 - Urban Elevations
- UVa221 - Urban Elevations
- javascript闭包 转
- virtual box设置多个网卡(最多8个网卡)
- Android开发指南-AIDL
- C++初学者应该看什么书
- hdu 1231 最大连续子序列
- UVA 221 - Urban Elevations(枚举+区间覆盖)
- 管道文件初探
- Delphi 画布对象及其简单应用
- Ubuntu下安装jdk6的方法和步骤
- 程序员的十层楼1-10
- 深入理解linux系统下proc文件系统内容
- 【自学笔记】Intent意图——实现简单的拨打电话功能代码
- 加班考勤统计
- hust1017 Exact cover DLX模板