zoj 1683 Fishnet

这题关键点就是把所有的交点全求出来 然后因为每4个交点组成一个四边形,根据叉积求面积,然后枚举出最大值

#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define eps 0.01
#define pi 3.1415926
using namespace std;

struct pot {
	double x, y;
	pot() {};
	pot(double _x, double _y): x(_x), y(_y) {};

	pot operator-(pot pt) {
		return pot(x - pt.x, y - pt.y);
	}

	double operator*(pot pt) {
		return (x * pt.y - y * pt.x);
	}

} pots[40][40];

double getdis(double x1, double y1, double x2, double y2) {
	return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

struct seg {
	pot p1, p2;
	pot crossedPt(seg sg) {
		pot p3 = sg.p1;
		pot p4 = sg.p2;
		double dis = getdis(p1.x, p1.y, p2.x, p2.y);
		double d1 = fabs((p2 - p1) * (p3 - p1)) / dis;
		double d2 = fabs((p2 - p1) * (p4 - p1)) / dis;
		double t = d1 / (d1 + d2);
		pot p = p4 - p3;
		return pot(p3.x + t * p.x, p3.y + t * p.y);
	}
};
seg hor[40], ver[40];


int main() {
	int n, i, j;
	double ans, area;
	while (scanf("%d", &n) && n) {
		//a
		for (i = 1; i <= n; i++) {
			scanf("%lf", &ver[i].p1.x);
			ver[i].p1.y = 0;
		}
		//b
		for (i = 1; i <= n; i++) {
			scanf("%lf", &ver[i].p2.x);
			ver[i].p2.y = 1;
		}
		//c
		for (i = 1; i <= n; i++) {
			scanf("%lf", &hor[i].p1.y);
			hor[i].p1.x = 0;
		}
		//d
		for (i = 1; i <= n; i++) {
			scanf("%lf", &hor[i].p2.y);
			hor[i].p2.x = 1;
		}

		hor[0].p1.x = 0;
		hor[0].p1.y = 0;
		hor[0].p2.x = 1;
		hor[0].p2.y = 0;

		hor[n + 1].p1.x = 0;
		hor[n + 1].p1.y = 1;
		hor[n + 1].p2.x = 1;
		hor[n + 1].p2.y = 1;

		ver[0].p1.x = 0;
		ver[0].p1.y = 0;
		ver[0].p2.x = 0;
		ver[0].p2.y = 1;

		ver[n + 1].p1.x = 1;
		ver[n + 1].p1.y = 0;
		ver[n + 1].p2.x = 1;
		ver[n + 1].p2.y = 1;


		pot p1, p2, p3, p4;
		for (i = 0; i <= n + 1; i++) {
			for (j = 0; j <= n + 1; j++) {
				pots[i][j] = hor[i].crossedPt(ver[j]);
			}
		}

		ans = 0;
		for (i = 1; i <= n + 1; i++) {
			for (j = 1; j <= n + 1; j++) {
				p1 = pots[i - 1][j - 1];
				p2 = pots[i][j - 1];
				p3 = pots[i][j];
				p4 = pots[i - 1][j];

				area = fabs((p2 - p1) * ( p3 - p1) / 2.0)  + fabs((p3 - p1) * (p4 - p1) ) / 2.0;
				ans = max(ans, area);
			}
		}

		printf("%.6f\n", ans);

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值