POJ 1408 Fishnet【枚举+线段相交+叉积求面积】
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 1604 | Accepted: 1026 |
Description
him. He found a square wood-frame and a long thread among the wrecks. He had to survive in this island until someone came and saved him.
In order to catch fish, he began to make a kind of fishnet by cutting the long thread into short threads and fixing them at pegs on the square wood-frame. He wanted to know the sizes of the meshes of the fishnet to see whether he could catch small fish as well
as large ones.
The wood frame is perfectly square with four thin edges on meter long: a bottom edge, a top edge, a left edge, and a right edge. There are n pegs on each edge, and thus there are 4n pegs in total. The positions of pegs are represented by their (x,y)-coordinates.
Those of an example case with n=2 are depicted in figures below. The position of the ith peg on the bottom edge is represented by (ai,0). That on the top edge, on the left edge and on the right edge are represented by (bi,1), (0,ci) and (1,di), respectively.
The long thread is cut into 2n threads with appropriate lengths. The threads are strained between (ai,0) and (bi,1),and between (0,ci) and (1,di) (i=1,...,n).
You should write a program that reports the size of the largest mesh among the (n+1)2 meshes of the fishnet made by fixing the threads at the pegs. You may assume that the thread he found is long enough to make the fishnet and the wood-frame is thin enough
for neglecting its thickness.
![](http://poj.org/images/1408_1.jpg)
Input
n
a1 a2 ... an
b1 b2 ... bn
c1 c2 ... cn
d1 d2 ... dn
you may assume 0 < n <= 30, 0 < ai,bi,ci,di < 1
Output
Sample Input
2
0.2000000 0.6000000
0.3000000 0.8000000
0.1000000 0.5000000
0.5000000 0.6000000
2
0.3333330 0.6666670
0.3333330 0.6666670
0.3333330 0.6666670
0.3333330 0.6666670
4
0.2000000 0.4000000 0.6000000 0.8000000
0.1000000 0.5000000 0.6000000 0.9000000
0.2000000 0.4000000 0.6000000 0.8000000
0.1000000 0.5000000 0.6000000 0.9000000
2
0.5138701 0.9476283
0.1717362 0.1757412
0.3086521 0.7022313
0.2264312 0.5345343
1
0.4000000
0.6000000
0.3000000
0.5000000
0
Sample Output
0.215657
0.111112
0.078923
0.279223
0.348958
Source
题意:
在直角坐标系中,把第一象限的那个单位面积的正方形分成 n*n 个小四边形,
求最大四边形面积
注意:
点的输入顺序【周边上点,都是按照从小到大的顺序输入的】
算法: 枚举+线段求交点+叉积求面积
思路:
存储每一个点【周边的+线段交点】,
然后依次遍历每一个四边形的面积
Code:
/****************************************************************************
C Accepted 208 KB 16 ms C++ 2155 B
题意:
在直角坐标系中,把第一象限的那个单位面积的正方形分成 n*n 个小四边形,
求最大四边形面积 注意:点的输入顺序【周边上点,都是按照从小到大的顺序输入的】 算法:枚举+线段求交点+叉积求面积 思路:存储每一个点【周边的+交点】,
然后依次遍历每一个四边形的面积
******************************************************************************/
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std; const int maxn = 40;
struct Point{
double x,y;
Point() {}
Point(double _x, double _y){
x = _x;
y = _y;
} Point operator + (const Point &B) const {
return Point(x+B.x, y+B.y);
}
Point operator - (const Point &B) const {
return Point(x-B.x, y-B.y);
}
Point operator * (const double &p) const {
return Point(p*x, p*y);
} }p[maxn][maxn];
typedef Point Vector; /** 叉积求面积 */
double Cross(Point A, Point B)
{
return A.x*B.y - A.y*B.x;
} /** 求线段交点 */
Point GetLineIntersection(Point P, Vector v, Point Q, Vector w){
Vector u = P-Q;
double t = Cross(w, u) / Cross(v, w);
return P+v*t;
} /** 根据四个点用叉积求四边形面积 */
double Area(Point a, Point b, Point c, Point d){
return fabs(Cross(c-a,b-a)) / 2.0 + fabs(Cross(c-a,d-a)) / 2.0;
} int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break; p[0][0] = Point(0,1); //定位四个顶点
p[0][n+1] = Point(1,1);
p[n+1][0] = Point(0,0);
p[n+1][n+1] = Point(1,0); double a,b,c,d; //依次存储周边的点
for(int i = 1; i <= n; i++) //a
{
scanf("%lf", &a);
p[n+1][i] = Point(a,0);
} for(int i = 1; i <= n; i++)// b
{
scanf("%lf", &b);
p[0][i] = Point(b,1);
} for(int i = n; i >= 1; i--) //c
{
scanf("%lf", &c);
p[i][0] = Point(0,c);
} for(int i = n; i >= 1; i--) //d
{
scanf("%lf", &d);
p[i][n+1] = Point(1,d);
} //求中间的交点
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
p[i][j] = GetLineIntersection(p[i][0], p[i][0]-p[i][n+1], p[n+1][j], p[n+1][j]-p[0][j]);
}
} double ans = 0;
double tmp;
//从上到下、从左到右依次遍历每个四边形
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
tmp = Area(p[i][j],p[i][j+1],p[i+1][j+1],p[i+1][j]);
ans = max(ans,tmp);
}
}
printf("%.6lf\n", ans);
}
return 0;
}
POJ 1408 Fishnet【枚举+线段相交+叉积求面积】的更多相关文章
- POJ 1039 Pipe 枚举线段相交
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9493 Accepted: 2877 Description ...
- 两条线段求交点+叉积求面积 poj 1408
题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...
- poj 1066(枚举+线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6328 Accepted: 2627 Des ...
- POJ 1066 Treasure Hunt(线段相交判断)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4797 Accepted: 1998 Des ...
- poj 3304(直线与线段相交)
传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...
- POJ 1066--Treasure Hunt(判断线段相交)
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7857 Accepted: 3247 Des ...
- POJ 1039 直线和线段相交
题意: 题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离. 分析: 光线一定经过一个上端点和一个下端点,这一点很容易想到.然后枚举上下端点即可 #include <iostream ...
- POJ 2653 Pick-up sticks(线段相交)
题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ...
- [poj 1127]Jack Straws[线段相交][并查集]
题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...
随机推荐
- Android笔记:invalidate()和postInvalidate() 的区别及使用——刷新ui
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
- 虚拟机下安装CentOS无法上网的解决方式
我使用VMware虚拟机安装Ubuntu和CentOS,都使用NAT模式连接网络,可是Ubutun能够正常上网,而CentOS不能连接到网络. 原来Centos7默认是不启用有线网卡的.须要手动开启. ...
- python challenge - map.py
Hint: K->M O->Q E->G everybody thinks twice before solving this. g fmnc wms bgblr rpy ...
- 【MyBatis学习04】mapper代理方法开发dao
上一篇博文总结了mybatis使用 原始dao的方法存在的一些弊端,我们肯定不会去用它,那么mybatis中该如何开发dao呢?如题所述,这篇博文主要来总结一下使用mapper代理的方法来开发dao的 ...
- Centos 7 部署FTP服务简单版
第三方教程推荐与参考: http://blog.csdn.net/somehow1002/article/details/70232791 先安装成功了,有信心了.再进一步扩展配置. 1.安装vsft ...
- 551. Student Attendance Record I【easy】
551. Student Attendance Record I[easy] You are given a string representing an attendance record for ...
- java - day12 - InteraceTest
接口的实现.继承等 package test.interfacedemo; import test.interfacedemo.Inter; public class InterfaceDemo { ...
- SpringBoot支持https和http
1.application.propertites #server.port=8081 server.port: 8443 server.ssl.key-store: classpath:keysto ...
- linux下独立core2.1部署发布过程
1.vs2017独立发布.linux-64 2.winscp上传到当前用户下面.ubuntu tsl64来讲 3.超级用户sudo su 4.zip解压缩 uzip xxx.zip -d ../../ ...
- lamp环境编译安装curl扩展
Linux编译安装php扩展包curl 1.curl,主要用于发送http请求,是php的一个扩展包. 2.安装过程: (1)curl下载:http://curl.haxx.se/download.h ...