标签:des style blog http color os
链接:http://acm.fzu.edu.cn/problem.php?pid=1015
在Dukeswood这块土地上生活着一个富有的农庄主和他的几个孩子。在他临终时,他想把他的土地分给他的孩子。他有许多农场,每个农场都是一块矩形土地。他在农场地图上划上一些直线将矩形分成若干块。当他划直线时,他总是从矩形边界上的某一点划到另一个矩形边界上的点,这条线的结束点将成为下一条线的起始点。他划线时从不会让任三线共点。例如图1是某一种划分结果。
划分的起始点和结束点均以五角星标记。当他完成划分后,他想要数一下划出的土地的块数以确保每个孩子都有一块地。例如,图1中土地被划分成18块。然而这个庄主由于年迈常会数错,因而他寻求你的帮助。
请写一个程序,输入原来的土地尺寸及线段的位置,输出划分出的土地块数。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream> 6 #include <algorithm> 7 #define eps 1e-6 8 9 struct point 10 { 11 double x,y; 12 }; 13 14 struct beline 15 { 16 point a,b; 17 }; 18 19 using namespace std; 20 21 point p[5000]; 22 23 bool dy(double x,double y) 24 { 25 return x > y+eps; 26 } 27 bool xy(double x,double y) 28 { 29 return x < y-eps; 30 } 31 bool xyd(double x,double y) 32 { 33 return x < y+eps; 34 } 35 bool dyd(double x,double y) 36 { 37 return x > y-eps; 38 } 39 double dd(double x,double y) 40 { 41 return fabs(x-y) < eps; 42 } 43 44 double crossProduct(point a,point b,point c) 45 { 46 return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x); 47 } 48 49 bool onSegment(point a,point b,point c) 50 { 51 double maxx=max(a.x,b.x); 52 double maxy=max(a.y,b.y); 53 double minx=min(a.x,b.x); 54 double miny=min(a.y,b.y); 55 if(dd(crossProduct(a,b,c),0.0)&&dyd(c.x,minx)&&xyd(c.x,maxx) 56 &&dyd(c.y,miny)&&xyd(c.y,maxy)) 57 return true; 58 return false; 59 } 60 61 bool segIntersect(point p1,point p2,point p3,point p4) 62 { 63 double d1 = crossProduct(p3,p4,p1); 64 double d2 = crossProduct(p3,p4,p2); 65 double d3 = crossProduct(p1,p2,p3); 66 double d4 = crossProduct(p1,p2,p4); 67 if(xy(d1*d2,0.0)&&xy(d3*d4,0.0)) 68 return true; 69 if(dd(d1,0.0)&&onSegment(p3,p4,p1)) 70 return true; 71 if(dd(d2,0.0)&&onSegment(p3,p4,p2)) 72 return true; 73 if(dd(d3,0.0)&&onSegment(p1,p2,p3)) 74 return true; 75 if(dd(d4,0.0)&&onSegment(p1,p2,p4)) 76 return true; 77 return false; 78 } 79 80 point intersectpoint(beline u,beline v) 81 { 82 point ans=u.a; 83 double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/ 84 ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); 85 ans.x+=(u.b.x-u.a.x)*t; 86 ans.y+=(u.b.y-u.a.y)*t; 87 return ans; 88 } 89 int main() 90 { 91 int n,m,i,j,k; 92 beline li[55]; 93 while(scanf("%d%d",&n,&m)!=EOF&&n||m) 94 { 95 scanf("%d",&k); 96 for(i=0;i<=k;i++) 97 { 98 scanf("%lf%lf",&p[i].x,&p[i].y); 99 } 100 for(i=0;i<k;i++) 101 { 102 li[i].a.x=p[i].x; 103 li[i].a.y=p[i].y; 104 li[i].b.x=p[i+1].x; 105 li[i].b.y=p[i+1].y; 106 } 107 108 int sum=0; 109 for(i=0;i<k;i++) 110 { 111 for(j=i+1;j<k;j++) 112 { 113 if(segIntersect(li[i].a,li[i].b,li[j].a,li[j].b)) 114 { 115 point tmp; 116 tmp=intersectpoint(li[i],li[j]); 117 if(dy(tmp.x,0.0)&&xy(tmp.x,(double)n)&&dy(tmp.y,0.0)&&xy(tmp.y,(double)m)) 118 { 119 sum++; 120 } 121 } 122 } 123 } 124 printf("%d\n",sum+k+1); 125 } 126 return 0; 127 }
fzu 1015 土地划分(判断线段相交+求出交点+找规律),布布扣,bubuko.com
fzu 1015 土地划分(判断线段相交+求出交点+找规律)
标签:des style blog http color os
原文地址:http://www.cnblogs.com/ccccnzb/p/3863327.html