题意是有 N 个正方形,每个正方形给出一条对角线的两个顶点坐标,然后判断他们到指定点的距离的大小关系,按距离从近到远,升序输出这些正方形的编号。

注意,正方形的边可能不和坐标轴平行,还有如果指定点在正方形内部的话,距离认为是 0 。

方法很显然的,根据对角线的两点坐标计算出剩下的两个点,然后计算指定点到这个正方形(凸四边形)的距离,也就是计算点到线段的距离,并取最小值。

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;const int N = 51;
const double MAX = 1e8;
const double eps = 1e-14;struct point{double x,y;
};struct square{point p1,p2;int id;double dist;
}s[N];int dcmp(double x){if (x < -eps) return -1; else return x > eps;
}int cmp(square a,square b){if(dcmp(a.dist-b.dist)==0)return a.id < b.id;return dcmp(a.dist - b.dist)<0;
}double min(double a,double b){if(dcmp(a-b)==1)return b;return a;
}
double max(double a,double b){if(dcmp(a-b)==1)return a;return b;
}double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}double crossProduct(point a,point b,point c){//向量 ac 在 ab 的方向 return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);
}int pin_convexh(point a,point p[]){//判断点a是否在凸多边形内int n=4;p[n] = p[0]; p[n+1] = p[1];for(int i=0; i<n; i++)if( dcmp(crossProduct(p[i],p[i+1],a)*crossProduct(p[i+1],p[i+2],a))==-1 )return 0;return 1;
}double jobs(point p,point l1,point l2){//点 p 到线段 l1l2 的最小距离point t = p;t.x += l1.y - l2.y;  t.y += l2.x - l1.x;if( dcmp( crossProduct(l1,t,p)*crossProduct(l2,t,p) ) != -1 ) //包括点和线段共线 return dcmp(dis(p,l1)-dis(p,l2))==-1 ? dis(p,l1) : dis(p,l2);return fabs( crossProduct(p,l1,l2) )/dis(l1,l2);
}point Whirl(double cosl, double sinl, point a, point b){//底边线段ab 绕a逆时针旋转角度A,b->b1,sinl是sinA的值   b.x -= a.x; b.y -= a.y;point c;c.x = b.x * cosl - b.y * sinl + a.x;c.y = b.x * sinl + b.y * cosl + a.y;return c;
}double fun(point cent,square ss){point p[10],mid;mid.x=(ss.p1.x+ss.p2.x)/2.0; mid.y=(ss.p1.y+ss.p2.y)/2.0;p[0]=ss.p1;p[1]=Whirl(0,1,mid,p[0]);p[2]=ss.p2;p[3]=Whirl(0,1,mid,p[2]);if(pin_convexh(cent,p)==1)return 0.0;else {double min_dist=MAX;for(int i=0;i<4;i++)min_dist=min(jobs(cent,p[i],p[i+1]),min_dist);return min_dist;}
}int main()
{point cent;int n,i;double a,b,c,d;while(~scanf("%d",&n)){for(i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&s[i].p1.x,&s[i].p1.y,&s[i].p2.x,&s[i].p2.y);s[i].id=i;}scanf("%lf%lf",¢.x,¢.y);for(i=1;i<=n;i++)s[i].dist=fun(cent,s[i]);sort(s+1,s+n+1,cmp);printf("%d",s[1].id);for(i=2;i<=n;i++)printf(" %d",s[i].id);puts("");}return 0;
}

神棍节献礼之——URAL1111 Squares(几何)相关推荐

  1. c语言for循环多条件判断,解决在for循环内判断条件多次执行

    最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...

  2. POJ - 3347 Kadj Squares(思维+几何)

    题目链接:点击查看 题目大意:给出n个正方形的边长,每个正方形必须与x轴有交点,且交点必须小,还需要满足每个正方形与x的交点依次递增,在满足以上条件的前提下,将所有的正方形防止在二维平面上,现在问从x ...

  3. 【数字几何处理】参数化:Tutte‘s embeddingLeast Squares Conformal Mappings 源码+介绍

    Tutte's embedding 原理:如果边界顶点有序的落在一个凸多边形上,且内部的顶点是其邻居的线性组合,那么(u,v)坐标参数化是双射的. [1000⋯0100⋯⋯⋯⋯⋯⋯wi,0wi,1−Σ ...

  4. 简单几何(线段覆盖) POJ 3347 Kadj Squares

    题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到. 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题.然后先求出每个矩形的左右端点,然后如果 ...

  5. CodeForces - 123B Squares(简单几何+旋转坐标系)

    题目链接:点击查看 题目大意:给出一个无限大的二维坐标平面,现在有一些坏点,规定: 满足以上两条件之一的点即为坏点,现在问最少经过多少个坏点的情况下,可以从起点到达终点 题目分析:一开始没想到坏点是如 ...

  6. UVA - 1643 Angle and Squares (角度和正方形)(几何)

    题意:第一象限里有一个角,把n(n <= 10)个给定边长的正方形摆在这个角里(角度任意),使得阴影部分面积尽量大. 分析:当n个正方形的对角线在一条直线上时,阴影部分面积最大. 1.通过给定的 ...

  7. 数学知识--Methods for Non-Linear Least Squares Problems(第三章)

    Methods for Non-Linear Least Squares Problems 非线性最小二乘问题的方法 2nd Edition, April 2004 K. Madsen, H.B. N ...

  8. ogr 缓冲区_GDAL的几何操作

    Date: 2015-08-13 12:43 Summary: 一段代码一个小功能,简单清晰又实用.翻译自英文的cookbook.Thanks the author for sharing us su ...

  9. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

  10. 计算机图形几何算法详解勘误

    一直在看<计算机图形几何算法详解>这本书,但是在用的过程中发现了一些错误,一直以为是自己的错误,后来在网上找到了这本书的勘误信息,不过是英文原版的,但是还是想贴出来,以便查找 07 Jul ...

最新文章

  1. 77GHz 和24GHz Radar性能解析
  2. VS2010 发布web项目 问题
  3. 编程爱好者学vb还是python-高手,这是高手!推荐几个我常看的顶级技术类公众号...
  4. CodeForces Gym-101350M
  5. XDR3020 WiFi6 11ax使用体验 11ax性能数据
  6. python语言语句快的标记是什么_一文搞懂Python程序语句
  7. sicily 1012. Stacking Cylinders
  8. 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动
  9. Java集合框架概述及Collection接口方法讲解
  10. centos 6.3最小化安装,无法上网解决方法
  11. 一个常见问题的解决——Ext grid的宽度高度如何自适应
  12. 在线EXCEL文件数据转换解析工具
  13. 运用GRASP原则来做uml交互类图-------pos机实例
  14. 第六章 who can see what
  15. 链表节点的删除(链表data升序有重复)
  16. Eclipse配置反编译问题
  17. visio一分二的箭头_Microsoft Office Visio绘画双箭头直线的具体步骤介绍
  18. 乌龟Git误点跳过工作树的解决方法
  19. 怎么更改wifi频段_wifi信道和频段怎么设置?
  20. Java使用iTextPDF生成PDF文件

热门文章

  1. 使用OpenCV编写图像窗宽窗位动态调节程序
  2. 建行手机银行4.0版本转账怎么不要求输入支付密码?
  3. linux系统上安装微信(Ubuntu/Debian 微信安装)
  4. Remarkable简单使用
  5. 解决from Crypto.Cipher import AES报错
  6. C# + HotKey
  7. html怎么转换成xmind,怎么把html导入XMind
  8. 掌上军营服务器信息,智慧军营之视频监控系统
  9. ubuntu18安装ros1
  10. php解析psd文件,PSD解析工具实现(二)