题意:
中文题, 略
思路:
在矩形内, 每多一条线,矩阵至少会被多分割一次。每当与其他直线相交, 矩阵会被再分割一次。
因为数据规模不大(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);
}
}