﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-唯思有杰-文章分类-计算几何</title><link>http://www.cppblog.com/chinshiketsu/category/14451.html</link><description>Jeffrey's area</description><language>zh-cn</language><lastBuildDate>Thu, 19 Aug 2010 03:03:09 GMT</lastBuildDate><pubDate>Thu, 19 Aug 2010 03:03:09 GMT</pubDate><ttl>60</ttl><item><title>Melkman算法</title><link>http://www.cppblog.com/chinshiketsu/articles/122547.html</link><dc:creator>陈斯杰</dc:creator><author>陈斯杰</author><pubDate>Sat, 07 Aug 2010 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/chinshiketsu/articles/122547.html</guid><wfw:comment>http://www.cppblog.com/chinshiketsu/comments/122547.html</wfw:comment><comments>http://www.cppblog.com/chinshiketsu/articles/122547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinshiketsu/comments/commentRss/122547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinshiketsu/services/trackbacks/122547.html</trackback:ping><description><![CDATA[<br><br>const&nbsp;epsilon=0.00000001;<br>type&nbsp;node=record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,y:real<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>end;</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodearr=array<font color=blue>[</font>1..20000<font color=blue>]</font>of&nbsp;node;<br><br>type&nbsp;linklist=^dynanode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynanode=record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre,next:linklist;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>end;</font><br><font color=blue>var&nbsp;</font>p0,p1,p2,p3,head,tail:linklist;<br><font color=blue>var&nbsp;</font>a:nodearr;<br>&nbsp;&nbsp;&nbsp;&nbsp;maxy,miny:real;maxi,mini:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;leftset,rightset,list:nodearr;<br>&nbsp;&nbsp;&nbsp;&nbsp;k1,k2,k:longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;n:longint;<br>//////////////////////<br>procedure&nbsp;tail_push(x:longint);<br><font color=blue>begin</font><br>new(p1);<br>tail^.next:=p1;<br>p1^.dat:=x;<br>p1^.pre:=tail;p1^.next:=nil;<br>tail:=p1;<br><font color=blue>end;</font><br><br>function&nbsp;tail_pop:longint;<br><font color=blue>begin</font><br>tail_pop:=tail^.dat;<br>tail:=tail^.pre;<br>dispose(tail^.next);<br>tail^.next:=nil;<br><font color=blue>end;</font><br><br>procedure&nbsp;head_push(x:longint);<br><font color=blue>begin</font><br>new(p2);<br>head^.pre:=p2;<br>p2^.dat:=x;<br>p2^.pre:=nil;p2^.next:=head;<br>head:=p2;<br><font color=blue>end;</font><br><br>function&nbsp;head_pop:longint;<br><font color=blue>begin</font><br>head_pop:=head^.dat;<br>head:=head^.next;<br>dispose(head^.pre);<br>head^.pre:=nil;<br><font color=blue>end;</font><br>///////////////////////<br><br>function&nbsp;equal(a,b:real):boolean;<br><font color=blue>begin</font><br><font color=blue>if&nbsp;</font>abs(a-b)&lt;epsilon&nbsp;<font color=blue>then</font>&nbsp;exit(true)&nbsp;<font color=blue>else</font>&nbsp;exit(false);<br><font color=blue>end;</font><br><br>function&nbsp;cross_product(x1,y1,x2,y2:real):real;<br><font color=blue>begin</font><br>exit(x1*y2-x2*y1);<br><font color=blue>end;</font><br><br>function&nbsp;left_side(p00,p11,p22:node):boolean;<br><font color=blue>var&nbsp;</font>ax,ay,bx,by:real;<br>&nbsp;&nbsp;&nbsp;&nbsp;product:real;<br>&nbsp;&nbsp;&nbsp;&nbsp;p0,p1,p2:node;<br><font color=blue>begin</font><br>p0:=p00;p1:=p11;p2:=p22;<br>ax:=p1.x-p0.x;ay:=p1.y-p0.y;<br>bx:=p2.x-p0.x;by:=p2.y-p0.y;<br>product:=cross_product(ax,ay,bx,by);<br><font color=blue>if&nbsp;</font>equal(product,0)and(&nbsp;(ax*ax+ay*ay)&gt;=(bx*bx+by*by))&nbsp;<font color=blue>then</font>&nbsp;exit(false);<br><font color=blue>if&nbsp;</font>equal(product,0)and(&nbsp;(ax*ax+ay*ay)&lt;&nbsp;(bx*bx+by*by))&nbsp;<font color=blue>then</font>&nbsp;exit(true);<br><font color=blue>if&nbsp;</font>product&gt;0<br><font color=blue>then</font>&nbsp;exit(true)<br><font color=blue>else</font>&nbsp;exit(false);<br><font color=blue>end;</font><br><br>procedure&nbsp;queue_init;<br><font color=blue>begin</font><br>new(p0);<br>new(p1);<br>new(p2);<br>new(p3);<br><font color=blue>if&nbsp;</font>left_side(list<font color=blue>[</font>1<font color=blue>]</font>,list<font color=blue>[</font>2<font color=blue>]</font>,list<font color=blue>[</font>3<font color=blue>]</font>)<br><font color=blue>then</font>&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head:=p0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0^.dat:=3;p0^.pre:=nil;p0^.next:=p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1^.dat:=1;p1^.pre:=p0;&nbsp;p1^.next:=p2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2^.dat:=2;p2^.pre:=p1;&nbsp;p2^.next:=p3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3^.dat:=3;p3^.pre:=p2;&nbsp;p3^.next:=nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail:=p3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br><font color=blue>else</font>&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head:=p0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0^.dat:=2;p0^.pre:=nil;p0^.next:=p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1^.dat:=1;p1^.pre:=p0;&nbsp;p1^.next:=p2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2^.dat:=3;p2^.pre:=p1;&nbsp;p2^.next:=p3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3^.dat:=2;p3^.pre:=p2;&nbsp;p3^.next:=nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail:=p3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>end;</font><br><font color=blue>end;</font><br><br>procedure&nbsp;qsort(<font color=blue>var&nbsp;</font>a:nodearr;l,r:longint);<br><font color=blue>var&nbsp;</font>i,j:longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;mid:node;<br>/////////<br>procedure&nbsp;swap(<font color=blue>var&nbsp;</font>a,b:node);<br><font color=blue>var&nbsp;</font>t:node;<br><font color=blue>begin</font><br>t:=a;a:=b;b:=t;<br><font color=blue>end;</font><br>//////////<br>function&nbsp;cmp(aa,bb:node):shortint;<br>{a&amp;b's&nbsp;relationship:0&nbsp;for&nbsp;&lt;;&nbsp;1&nbsp;for&nbsp;=;&nbsp;&nbsp;2&nbsp;for&nbsp;&gt;&nbsp;}<br><font color=blue>begin</font><br><font color=blue>if&nbsp;</font>equal((aa.y),(bb.y))<br><font color=blue>then</font>&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>if&nbsp;</font>equal(aa.x,bb.x)&nbsp;<font color=blue>then</font>&nbsp;exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>if&nbsp;</font>aa.x&nbsp;&gt;&nbsp;bb.x&nbsp;<font color=blue>then</font>&nbsp;exit(2)&nbsp;<font color=blue>else</font>&nbsp;exit(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>end;</font><br><font color=blue>if&nbsp;</font>aa.y&gt;bb.y&nbsp;<font color=blue>then</font>&nbsp;exit(2)&nbsp;<font color=blue>else</font>&nbsp;exit(0);<br><font color=blue>end;</font><br><br><font color=blue>begin</font><br>i:=l;j:=r;mid:=a<font color=blue>[</font>(i+j)div&nbsp;2<font color=blue>]</font>;<br>repeat<br>&nbsp;&nbsp;while&nbsp;cmp(a<font color=blue>[</font>i<font color=blue>]</font>,mid)=0&nbsp;do&nbsp;inc(i);<br>&nbsp;&nbsp;while&nbsp;cmp(mid,a<font color=blue>[</font>j<font color=blue>]</font>)=0&nbsp;do&nbsp;dec(j);<br>&nbsp;&nbsp;<font color=blue>if&nbsp;</font>i&lt;=j<br>&nbsp;&nbsp;<font color=blue>then</font>&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(a<font color=blue>[</font>i<font color=blue>]</font>,a<font color=blue>[</font>j<font color=blue>]</font>);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc(i);dec(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>end;</font><br>until&nbsp;i&gt;j;<br><font color=blue>if&nbsp;</font>l&lt;j&nbsp;<font color=blue>then</font>&nbsp;qsort(a,l,j);<br><font color=blue>if&nbsp;</font>i&lt;r&nbsp;<font color=blue>then</font>&nbsp;qsort(a,i,r);<br><font color=blue>end;</font><br><br>procedure&nbsp;init;<br><font color=blue>var&nbsp;</font>i:integer;<br><font color=blue>begin</font><br>fillchar(a,sizeof(a),0);<br>fillchar(leftset,sizeof(leftset),0);<br>fillchar(rightset,sizeof(rightset),0);<br>fillchar(list,sizeof(list),0);<br><br>maxy:=-maxlongint;miny:=maxlongint;<br>maxi:=0;mini:=0;<br><br>assign(input,'melkman.in');<br>assign(output,'melkman.out');<br>reset(input);rewrite(output);<br><br>readln(n);{input&nbsp;data}<br>for&nbsp;i:=1&nbsp;to&nbsp;n&nbsp;do<br>&nbsp;&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;readln(a<font color=blue>[</font>i<font color=blue>]</font>.x,&nbsp;a<font color=blue>[</font>i<font color=blue>]</font>.y);<br>&nbsp;&nbsp;<font color=blue>if&nbsp;</font>a<font color=blue>[</font>i<font color=blue>]</font>.y&gt;maxy&nbsp;<font color=blue>then</font>&nbsp;<font color=blue>begin</font>&nbsp;maxy:=a<font color=blue>[</font>i<font color=blue>]</font>.y;maxi:=i;<font color=blue>end;</font><br>&nbsp;&nbsp;<font color=blue>if&nbsp;</font>a<font color=blue>[</font>i<font color=blue>]</font>.y&lt;miny&nbsp;<font color=blue>then</font>&nbsp;<font color=blue>begin</font>&nbsp;miny:=a<font color=blue>[</font>i<font color=blue>]</font>.y;mini:=i;<font color=blue>end;</font><br>&nbsp;&nbsp;<font color=blue>end;</font><br>{sort}<br>k1:=0;k2:=0;<br>for&nbsp;i:=1&nbsp;to&nbsp;n&nbsp;do<br>&nbsp;&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;<font color=blue>if&nbsp;</font>left_side(a<font color=blue>[</font>mini<font color=blue>]</font>,a<font color=blue>[</font>maxi<font color=blue>]</font>,a<font color=blue>[</font>i<font color=blue>]</font>)<br>&nbsp;&nbsp;<font color=blue>then</font>&nbsp;<font color=blue>begin</font>&nbsp;inc(k1);leftset<font color=blue>[</font>k1<font color=blue>]</font>:=a<font color=blue>[</font>i<font color=blue>]</font>;end<br>&nbsp;&nbsp;<font color=blue>else</font>&nbsp;<font color=blue>begin</font>&nbsp;inc(k2);rightset<font color=blue>[</font>k2<font color=blue>]</font>:=a<font color=blue>[</font>i<font color=blue>]</font>;<font color=blue>end;</font><br>&nbsp;&nbsp;<font color=blue>end;</font><br>;<br>qsort(leftset,1,k1);<br>qsort(rightset,1,k2);<br>list:=rightset;<br>k:=k2;<br>for&nbsp;i:=k1&nbsp;downto&nbsp;1&nbsp;do<br>&nbsp;&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;inc(k);<br>&nbsp;&nbsp;list<font color=blue>[</font>k<font color=blue>]</font>:=leftset<font color=blue>[</font>i<font color=blue>]</font>;<br>&nbsp;&nbsp;<font color=blue>end;</font>{now,&nbsp;list&nbsp;saves&nbsp;sorted&nbsp;nodes}<br><font color=blue>end;</font><br><br>procedure&nbsp;melkman;<br><font color=blue>var&nbsp;</font>i:longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;null:longint;<br><font color=blue>begin</font><br>queue_init;<br>i:=4;<br>while&nbsp;i&lt;=n&nbsp;do<br>&nbsp;&nbsp;<font color=blue>begin</font><br>&nbsp;&nbsp;<font color=blue>if&nbsp;</font>(left_side(list<font color=blue>[</font>(tail^.pre)^.dat&nbsp;<font color=blue>]</font>,&nbsp;list<font color=blue>[</font>&nbsp;tail^.dat&nbsp;<font color=blue>]</font>&nbsp;,list<font color=blue>[</font>i<font color=blue>]</font>)=true)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and(left_side(list<font color=blue>[</font>(head^.next)^.dat<font color=blue>]</font>&nbsp;,list<font color=blue>[</font>&nbsp;head^.dat&nbsp;<font color=blue>]</font>&nbsp;,&nbsp;list<font color=blue>[</font>i<font color=blue>]</font>)=false)<br>&nbsp;&nbsp;<font color=blue>then</font>&nbsp;<font color=blue>begin</font>&nbsp;inc(i);continue;<font color=blue>end;</font><br>&nbsp;&nbsp;while&nbsp;(left_side(list<font color=blue>[</font>(tail^.pre)^.dat&nbsp;<font color=blue>]</font>,&nbsp;list<font color=blue>[</font>&nbsp;tail^.dat&nbsp;<font color=blue>]</font>&nbsp;,list<font color=blue>[</font>i<font color=blue>]</font>&nbsp;)=false)&nbsp;do&nbsp;null:=tail_pop;<br>&nbsp;&nbsp;tail_push(i);<br>&nbsp;&nbsp;while&nbsp;(left_side(list<font color=blue>[</font>(head^.next)^.dat<font color=blue>]</font>&nbsp;,list<font color=blue>[</font>&nbsp;head^.dat&nbsp;<font color=blue>]</font>&nbsp;,&nbsp;list<font color=blue>[</font>i<font color=blue>]</font>)=true)&nbsp;&nbsp;do&nbsp;null:=head_pop;<br>&nbsp;&nbsp;head_push(i);<br>&nbsp;&nbsp;inc(i);<br>&nbsp;&nbsp;<font color=blue>end;</font><br><font color=blue>end;</font><br><br>procedure&nbsp;print;<br><font color=blue>begin</font><br>p1:=head;<br>repeat<br>writeln(p1^.dat,':(',list<font color=blue>[</font>p1^.dat<font color=blue>]</font>.x:0:1,',',list<font color=blue>[</font>p1^.dat<font color=blue>]</font>.y:0:1,')');<br>p1:=p1^.next;<br>until&nbsp;p1^.next=nil;<br>readln;readln;<br><font color=blue>end;</font><br><br><font color=blue>begin</font><br>init;<br>melkman;<br>print;<br>close(input);close(output);<br><font color=blue>end.</font><br>&nbsp;<br><br>
<img src ="http://www.cppblog.com/chinshiketsu/aggbug/122547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinshiketsu/" target="_blank">陈斯杰</a> 2010-08-07 17:53 <a href="http://www.cppblog.com/chinshiketsu/articles/122547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>