广场舞

2024-03-29 17:08
文章标签 广场

本文主要是介绍广场舞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


LQ市的市民广场是一个多边形,广场上铺满了大理石的地板砖。

地板砖铺得方方正正,就像坐标轴纸一样。
以某四块砖相接的点为原点,地板砖的两条边为两个正方向,一块砖的边长为横纵坐标的单位长度,
则所有横纵坐标都为整数的点都是四块砖的交点(如果在广场内)。

广场的砖单调无趣,却给跳广场舞的市民们提供了绝佳的参照物。每天傍晚,都会有大批市民前来跳舞。
舞者每次都会选一块完整的砖来跳舞,两个人不会选择同一块砖,如果一块砖在广场边上导致缺角或者边不完整,则没人会选这块砖。
(广场形状的例子参考【图1.png】)

现在,告诉你广场的形状,请帮LQ市的市长计算一下,同一时刻最多有多少市民可以在广场跳舞。

【输入格式】
输入的第一行包含一个整数n,表示广场是n边形的(因此有n个顶点)。
接下来n行,每行两个整数,依次表示n边形每个顶点的坐标(也就是说广场边缘拐弯的地方都在砖的顶角上。数据保证广场是一个简单多边形。

【输出格式】
输出一个整数,表示最多有多少市民可以在广场跳舞。

【样例输入】
5
3 3
6 4
4 1
1 -1
0 4

【样例输出】
7

【样例说明】
广场如图1.png所示,一共有7块完整的地板砖,因此最多能有7位市民一起跳舞。

【数据规模与约定】
对于30%的数据,n不超过100,横纵坐标的绝对值均不超过100。
对于50%的数据,n不超过1000,横纵坐标的绝对值均不超过1000。
对于100%的数据,n不超过1000,横纵坐标的绝对值均不超过100000000(一亿)。
这里写图片描述
第七届蓝桥杯决赛B组第5题


分析

简单的小学几何,首先以人的思维方式,通过从上到下从左到右完整的数有几个小正方形,但是转化为电脑首先我要计算一个点是否在多边形内,如果该点位于多边形内,那么考虑与该点相邻的右点,下点以及对角点是否存在于多边形内,如果四个点均位于多边形内,那么这四个点构成小正方形,想法是不是很简单啊?如何判断呢?
首先我们要得到x,y的边界值,如果不在边界范围内的值,肯定不会构成小正方形;
然后从边界对每一个点开始扫描,根据是否能构成小正方形
这样是不是很简单了

代码


废话少说直接上代码

#include<iostream>
using namespace std;//待输入的点的坐标
float vxx[100];
float vyy[100];
int num;//多边形//判断是否在多边形边上和内部
//判断点是否在多边形内
/*
bool IsInPolygon(int x, int y, int vertex[][2], int num)
{if (num < 3)return false;//两点构成直线int cnt = 0;for (int i = 0; i < num; i++){int p1[2] = { vertex[i][0],vertex[i][1] };//当前的点int p2[2] = { vertex[(i + 1) % num][0],vertex[(i + 1) % num][1] };//与之相邻的点  构成封闭图形if (p2[1] == p1[1]&&p2[0]==p1[0])continue;//继续循环if (y < p2[1] && y < p1[1])//上下有问题continue;if (y > p2[1] && y > p1[1])continue;//y在内部int xx = (y - p1[1])* (p2[0] - p1[0]) / (p2[1] - p1[1]) + p1[0];if (xx >= x)cnt++;}return (cnt % 2 == 1);
}*///nvert 表示多边形的点的个数   
//vertx[]  verty[]  多边形各个顶点所在的位置  testx  testy带判断的点的坐标值
//在四边形内是1 不在是0 包括边线上的点
int pnpoly(int nvert, float vertx[], float verty[], float testx, float testy)
{for (int k = 0; k < nvert; k++)//遍历全部顶点{//待判断的点为多边形的顶点,即点属于多边形if (testx == vertx[k] && testy == verty[k])return 1;}//多边形边上的点平行于x轴for (int i = 0; i < num; i++){//多边形内的任意点 以及与之相连接的下一个点 x y坐标的偏移量float dy = verty[(i + 1) % num] - verty[i];float dx = vertx[(i + 1) % num] - vertx[i];float k = dy / dx;//某边的斜率//待测点与当前点的斜率if (((verty[i] - testy) / (vertx[i] - testx)) == k((testx>vertx[i]&&testx<vertx[(i+1)%num])|| testx<vertx[i] && testx>vertx[(i + 1) % num])))return 1;//if (testy == verty[i] && verty[(i + 1) % num] == verty[i] && testy == verty[(i + 1) % num])return 1;}//平行于y轴for (int i = 0; i < num; i++){//同一条直线上if (testx == vertx[i] && vertx[(i + 1) % num] == vertx[i]&&((testy<verty[i]&&testy>verty[(i+1)%num])|| (testy>verty[i] && testy<verty[(i + 1) % num])))return 1;}int i, j, c = 0;for (i = 0, j = nvert - 1; i < nvert; j = i++)//多边形内的{if (((verty[i]>testy) != (verty[j]>testy)) &&(testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))c = !c;}return c;
}//找出边的上下左右边界,即x max min   y max min
bool IsSquare(int x, int y)
{if (pnpoly(num, vxx, vyy, x, y) == 1)//当前的点在多边形上{if (pnpoly(num, vxx, vyy, x + 1, y) == 0)return false;//左边的点if (pnpoly(num, vxx, vyy, x, y - 1) == 0)return false;//下边的点if (pnpoly(num, vxx, vyy, x + 1, y - 1) == 0)return false;//对角的点cout << x << "," << y << endl;//输出每个小正方形的左上角return true;}elsereturn false;
}/*心型数据
6
1 3
2 4
3 3
4 4
5 3
3 -1
*/int main()
{int cnt = 0;cin >> num;//输入多边形的个数for (int i = 0; i < num; i++){cin >> vxx[i] >> vyy[i];}//得到图形的边界   即 x的左右边界  y的上下边界float xMax = vxx[0], xMin = vxx[0], yMax = vyy[0], yMin = vyy[0];for (int i = 0; i < num; i++){if (vxx[i] > xMax)xMax = vxx[i];if (vxx[i] < xMin)xMin = vxx[i];if (vyy[i] > yMax)yMax = vyy[i];if (vyy[i] < yMin)yMin = vyy[i];}//扫描函数  得到  x 取值范围   y取值范围cout << "xMax=" << xMax << ",xMin=" << xMin << ",yMax=" << yMax << ",yMin=" << yMin << endl;//扫描函数依次判断for (float x = xMin; x <= xMax; x++){for (float y = yMax; y >= yMin; y--){//是否构成小正方形if (IsSquare(x, y) == true)cnt++;if (pnpoly(num, vxx, vyy, x, y) == 1)cout << "(" << x << "," << y << ")" << endl;}}cout << "共"<<cnt<<"个小正方形" << endl;return 0;
}

转载时,请注明出处,谢谢合作 感谢,帮我指正错误的那个博友,关于x的边界判断缺少限制

这篇关于广场舞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859161

相关文章

戏曲多多 v1.0.4 — 专为老年人打造的戏曲娱乐软件(含经典评书与广场舞)

戏曲多多 TV 是一款专为老年人量身打造的视频娱乐软件,安装在智能电视、智能机顶盒、投影仪等安卓系统设备上后,老年人可以在电视上轻松观看各种戏曲视频。软件涵盖豫剧、京剧、秦腔、越剧、昆曲、淮剧、川剧、黄梅戏等多种戏曲类型。除了戏曲,还提供经典相声评书、广场舞教学、中老年健康运动、养生太极、家庭医疗宝典等内容。功能丰富多样,操作简单,支持搜索、播放进度和速度调整,以及观看记录功能。 链接:http

上海市嘉定区三德广场屋顶气膜篮球馆

上海市嘉定区三德广场屋顶气膜篮球馆为现代化城市综合体增添了一处先进、环保的运动设施。这座篮球馆不仅为广场周边居民提供了一个全天候的运动场所,也为嘉定区的体育爱好者带来了全新的健身体验。作为轻空间(江苏)膜科技有限公司(以下简称“轻空间”)的又一力作,该气膜篮球馆充分展示了轻空间在气膜建筑领域的技术优势和专业实力。 该项目位于上海市嘉定区三德广场的屋顶,采用了轻空间最新的气膜技术,确保场馆拥有

基于springboot+vue+Mysql的广场舞团管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 系统首页 社团界面 社团活动界面 用户登录 管理员功能界面 地区管理 舞团类型管理 社团

Java毕业设计-基于springboot开发的广场舞团系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台登录模块2.1管理员功能模块2.2社团功能模块2.3用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的广场舞团系统-毕业论文+答辩PPT(附源代码+演示视频) 如需其他项目或毕设源码,可进主

京城“瘦身”带来地产利好 智汇广场紧抓机遇

北京人口疏解计划已经筹备多时,从动物园、新发地等各类批发市场搬迁,再到开墙的沿街小店铺纷纷关张,这些都是疏解非首都功能、引导人口疏解转移的举措。目前,北京市的综合整治工作仍在有条不紊的进行中。 京城“瘦身” 环京楼市受益 2017年是京津冀一体化战略进入提速阶段的一年,而疏解非首都功能是盘活京津冀一体化的关键。北京首都功能的定位以及对于非首都功能的调整,是一个大而明确的战略目标。未来北京的发展

LiveNVR监控流媒体Onvif/RTSP功能-视频广场点击在线或离线时展示状态记录快速查看通道离线原因

LiveNVR视频广场点击在线或离线时展示状态记录快速查看通道离线原因 1、状态记录1.1、点击在线查看1.2、点击离线查看 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、状态记录 1.1、点击在线查看 可以点击视频广场页面中, 在线 两个字查看状态记录 1.2、点击离线查看 可以点击视频广场页面中, 离线 两个字查看状态记录,查看通道离线原因

广场舞 蓝桥真题

https://www.dotcpp.com/oj/problem1838.html 50%数据参考博客https://blog.csdn.net/qq_39562286/article/details/80033097 很多博客的思路都是 枚举每个小正方形的右上角 然后判断其余三个角是不是在多边形内 但是当出现斜率不存在的直线时就不好使了 比如下面这个样例 6 0 0 2 0 2 3 1

基于springboot广场舞团管理系统源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,广场舞团就是信息时代变革中的产物之一。 任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于java语言设计并实现了广场舞团。该

游戏陪玩 语音聊天系统3.0商业升级独立版本源码 打赏功能 动态广场功能

1.增加人气店员轮播 2.优化ui界面丨优化游戏图标展示丨优化分类展示 3.增加动态礼物打赏功能 4.增加礼物墙功能 增加店员满足业绩,才能升级功能 5.增加店员等级不同,可接单的价格不同 6.更新:动态广场功能(支持视频语音图片)

交友脱单盲盒源码,纸条广场,支持单独抽取/连抽/同城

源码介绍 交友脱单盲盒源码,纸条广场,单独抽取/连抽/同城。 盲 盒交友脱单系统源码包含了学校、爱好、城市、地区、星座等 等信息,具有首页轮转广告和页面美化功能。 首页提供了两款 连抽和高质量底部连抽的选项,并且可以在后台进行开关设 置。系统还提供邀请奖励,可以选择奖励爱心或其他形式,提 现达到一定金额还有提成奖励。 系统支持二级分销,可以重构 主界面并优化程序速度。另外,还提供了纸条