一:题目

给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h。问从南面看过去能看到几座房子。

城市俯视图和主视图

注意:

输出主视图中能够看到的所有建筑物按照左下角x坐标从小到大进行排序。左下角x坐标相同时,按照y轴坐标从小到大排序

(一)样例输入

14    //14个建筑物
30  //x,y轴,横向宽度w,纵向宽度d,高度h 0  //结束符号

(二)样例输出

For map # ,the visible buildings are numbered as followws:
        

二:代码实现

(一)思路分析

判断可见性比较麻烦,因为一个建筑物可能只是部分可见,无法枚举所有x坐标,来查看这个建筑物在该点处是否可见,因为x坐标有无穷个。
解决方法:离散化--->将无穷变有限

具体实现:

将所有x坐标排序去重,则任意两个相邻的x坐标形成的区间具有相同属性,可见或者不可见。我们取区间中任意一点(取中点)判断可见性

(二)代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm> using namespace std;
#define MAX 101 struct Builds
{
int id;
double x, y, w, d, h;
bool operator<(struct Builds& other) const //按题意输出要求设置:x从小到大,当x相同时,y从小到大
{
return x < other.x || (x == other.x&&y <
other.y);
}

}b[MAX]; //用于保存建筑信息 double check_pos[MAX * ]; //用于保存所有检测点
int n; //获取总建筑数量 bool cover(int i, double x_p) //用于检测该建筑是否在x轴上面包含了该点x_p
{
return b[i].x <= x_p&&b[i].x + b[i].w >= x_p;
}
bool visiable(int i, double x_p) //用于检测建筑i在x_p上是否可见
{
//1.先看该建筑物是否包含这个x_p点
if (!cover(i, x_p))
return false;
//2.看包含这个点的其他建筑物是否高于自己
for (int j = 0; j < n; j++)
{
if (j==i) continue;
if (cover(j, x_p) && b[j].h>=b[i].h&& b[j].y < b[i].y) //cover包含该点,h高于i建筑,y且在i建筑前面
return false;
}
return true;
}
int main()
{
freopen("data5_12.in", "r", stdin);
freopen("data5_12.out", "w", stdout);
int count = ; while (cin >> n&&n != )
{
//先获取所有建筑信息
for (int i = ; i < n; i++)
{
cin >> b[i].x >> b[i].y >> b[i].w >> b[i].d >> b[i].h; //获取建筑信息
b[i].id = i + ;
check_pos[i * ] = b[i].x; //获取检测点信息
check_pos[i * + ] = b[i].x + b[i].w;
} sort(b, b + n); //对建筑物进行排序 按照重载<进行排序
sort(check_pos, check_pos+2 * n); //对检测点进行排序
//unique返回去重后的最后一个元素的位置double*
int m = unique(check_pos, check_pos + 2 * n)-check_pos; //对监测点进行去重
//输出信息
cout << "For map #" << count++ << " ,the visible buildings are numbered as followws:" << endl;
//进行判断各个建筑物的可见性
for (int i = 0; i < n; i++)
{
bool flag = false;
for (int j = 0; j < m - 1; j++)
{
double central_pos = (check_pos[j] + check_pos[j + 1]) / 2; //找到中心点
if (visiable(i, central_pos))
{
flag = true;
break;
}
}
if (flag)
cout << b[i].id << " "
;
}

} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return ;
}

算法习题---5.12城市正视图<离散化应用>(Uva221)*****的更多相关文章

  1. UVa 221 Urban Elevations 城市正视图 离散化初步 无限化有限

    转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 221 Urban Elevations 给出城市中建筑物的x, ...

  2. 算法习题---3.12浮点数(UVa11809)

    一:题目 尴尬的非会员水印 二:题目摘要 1.int和float比较 int共32位,可以表示的最大的数为2^32次方 float虽然也是32位,但是是以指数形式保存,指数占8位(含符号),最大127 ...

  3. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  4. 基于verilog的FFT算法8点12位硬件实现

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  5. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  6. 数据结构和算法(Golang实现)(12)常见数据结构-链表

    链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...

  7. UVa 221城市正视图(离散化)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  9. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

随机推荐

  1. 扫雷小游戏PyQt5开发【附源代码】

    也没啥可介绍哒,扫雷大家都玩过. 雷的分布算法也很简单,就是在雷地图(map:二维数组)中,随机放雷,然后这个雷的8个方位(上下左右.四个对角)的数字(非雷的标记.加一后不为雷的标记)都加一. 如何判 ...

  2. keras模块学习之-目标函数(objectives)笔记

    本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! 目标函数又称损失函数(loss),目的是计算神经网络的输出与样本标记的差的一种方法,如: model = Sequential() ...

  3. 项目中使用express,只是单纯项目中使用

    安装express npm install express --save-dv 建议安装到dev依赖里面 安装body-parse npm install body-parser --save-dev ...

  4. 做vue项目时,收集的一些有意思的功能

    1. element-ui dialog组件添加可拖拽位置 可拖拽宽高 https://segmentfault.com/a/1190000012940145

  5. Tensorflow细节-P42张量的概念及使用

    1.运行以下代码 import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2. ...

  6. 2019-2020-1 20199302《Linux内核原理与分析》第三周作业

    云班课学习内容 一.C语言中嵌入汇编代码 1.内嵌汇编语法 (1)C语言中嵌入汇编代码的写法: asm( 汇编语句模板: 输出部分: 输入部分: 破坏描述部分): 说明:输出部分和输入部分对应着C语言 ...

  7. c语言数组的概念和指针的加减使用

    //数组变量名:就是一个地址:就是数组首元素的地址#include <stdio.h> int main(void) { int age[5] = {10,50,100,22,44}; / ...

  8. Hdu 2157 How many ways??(DP||矩阵乘法)

    How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...

  9. 洛谷 P5436 【XR-2】缘分 题解

    P5436 [XR-2]缘分 题目背景 世间万物都置身于缘分编织的大网中.缘分未到,虽历经千劫,却不能相遇.缘分到了,在草原上都能等到一艘船.--<一禅小和尚> 题目描述 一禅希望知道他和 ...

  10. UOJ226. 【UR #15】奥林匹克环城马拉松 [组合数学,图论]

    UOJ 思路 我们知道关于有向图欧拉回路计数有一个结论:在每个点入度等于出度的时候,答案就是 \[ t_w(G)\prod (deg_i-1)! \] 其中\(t_w(G)\)是以某个点为根的树形图个 ...