[刷题笔记] FZU 1015 土地划分

题意:

中文题, 略

思路:

在矩形内, 每多一条线,矩阵至少会被多分割一次。每当与其他直线相交, 矩阵会被再分割一次。

因为数据规模不大(L<=50), 暴力枚举算出相交线段数即可。

要点:

判断两线段是否相交; 快速排斥实验 + 跨立实验 (这东西到处都有就不说了

另外这题比较特殊, 只要用跨立实验判断即可。

代码:

#include<iostream>
using namespace std;
const int N = 150;
struct point
{
	int x;
	int y;
	point &operator-(point p)
	{
		x -= p.x;
		y -= p.y;
		return *this;
	}
};
int direction(point p1, point p2, point p3)
{
	point lv = p2 - p1, rv = p3 - p1;
	return lv.x * rv.y - rv.x*lv.y;
}
bool cross(point p1, point p2, point p3, point p4)
{
	return (direction(p1, p2, p3) * direction(p1, p4, p3)<0) 
			&&(direction(p2, p3, p4) * direction(p2, p1, p4)<0);
}
int main()
{
	//freopen("in.txt","r",stdin);
	point l[N];
	int w, h, n;
	int i;
	while(scanf("%d%d", &w, &h), w||h)
	{
		scanf("%d", &n);
		for(i=0;i<=n;i++)
			scanf("%d %d", &l[i].x, &l[i].y);
		int j, ans = 0;
		if(n<=2)
			ans = n + 1;
		else
		{
			ans = n + 1;
			for(i=3;i<=n;i++)
			{
				for(j=i-2;j>=1;j--)
				{
					if(cross(l[i-1], l[j-1], l[i], l[j]))
						ans++;
				}
			}
		}
		printf("%d\n", ans);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值