算法习题---5.12城市正视图<离散化应用>(Uva221)*****
时间:2019-09-15
本文章向大家介绍算法习题---5.12城市正视图<离散化应用>(Uva221)*****,主要包括算法习题---5.12城市正视图<离散化应用>(Uva221)*****使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一:题目
给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h。问从南面看过去能看到几座房子。
城市俯视图和主视图
注意:
输出主视图中能够看到的所有建筑物按照左下角x坐标从小到大进行排序。左下角x坐标相同时,按照y轴坐标从小到大排序
(一)样例输入
14 //14个建筑物 160 0 30 60 30 //x,y轴,横向宽度w,纵向宽度d,高度h 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 //结束符号
(二)样例输出
For map #1 ,the visible buildings are numbered as followws: 5 9 4 3 10 2 1 14
二:代码实现
(一)思路分析
判断可见性比较麻烦,因为一个建筑物可能只是部分可见,无法枚举所有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 * 2]; //用于保存所有检测点 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 = 1; while (cin >> n&&n != 0) { //先获取所有建筑信息 for (int i = 0; i < n; i++) { cin >> b[i].x >> b[i].y >> b[i].w >> b[i].d >> b[i].h; //获取建筑信息 b[i].id = i + 1; check_pos[i * 2] = b[i].x; //获取检测点信息 check_pos[i * 2 + 1] = 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 0; }
原文地址:https://www.cnblogs.com/ssyfj/p/11523547.html
- python爬虫反爬取---设置IP代理自动变换requests.get()中proxy的IP
- 【译】TensorFlow实现Batch Normalization
- 关于Python语言规范你需要知道的一些小tips
- R语言可视化——REmap(路径图)
- python面向对象
- 字符串hash入门
- R语言数据处理——数据合并与追加
- python爬取链家租房之获取房屋页面的详细信息(房名,地址,房价,面积,url)
- 信用卡“坏账”客户分析(二)
- Mac上提升python运算速度-PyPy初体验
- python处理json数据(复杂的json转化成嵌套字典并处理)
- Pointer-network理论及tensorflow实战
- python3 log文件处理获取某天需要的数据
- 实战深度强化学习DQN-理论和实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android空心圆及层叠效果实现代码
- 如何更改Dialog的标题与按钮颜色详解
- Android编程之数据库的创建方法详解
- android studio集成ijkplayer的示例代码
- Android开发实现浏览器全屏显示功能
- Android动态人脸检测的示例代码(脸数可调)
- Android抽奖轮盘的制作方法
- Android 获取屏幕的多种宽高信息的示例代码
- Android编程实现禁止StatusBar下拉的方法
- Android自定义view圆并随手指移动
- Android仿微信发送语音消息的功能及示例代码
- 详解Android studio ndk配置cmake开发native C
- Android编程实现禁止状态栏下拉的方法详解
- Android进度条ProgressBar的实现代码
- Android画画板的制作方法