算法题目1——闭合篱笆

来源:互联网 发布:个性淘宝女装店名 编辑:程序博客网 时间:2024/04/29 22:58

 题目:

 

 

 

 

解答思路:

(1)  对于判断篱笆的合法性,就是要判断篱笆是否自交。

            我们对于两条不相邻的边作判断,就需要求出两条直线的交点。

            但是,两条直线的位置并不能反映这两条边(线段)的位置关系,

            所以,不仅要求出这两条边所在的直线的交点,还要求出交点相对

            两条边的位置。

            如下图,两条边1-2 和3-4的交点为5,设有向线段1-5的有向长度为

            线段1-2的d1倍,有向线段3-5的有向长度为线段3-4的d2倍,则通过

            d1和d2的不同值,就可以得到两条边的位置关系。这样,两条边相

            交则有:0<d1<1; 且 0<d2<1

 

 

(2) 要找出所有能看见的边。判断一条边是否能被看见,需要判断该边的

            每个部分是否都被其他边所挡住。根据题意,对于每条边,只需考虑

            是否有一条边与其他边均不相交的光线找到它上面,即在这条边上有

            一点与点(X,Y)所连的线段与其他边不相交。

            但是,一条边上有无数个点,要选择哪一个点进行判断呢?对于每一

            条边,我们先找出挡在这条边前面的所有端点(包含这条边的两个端

            点)如下图:点1为人所占的点,边3-4为所考虑的边,则档在边3-4前

            面的端点需要满足:d1>1;0<d2<1。找出这些端点后,光线只能从这些

            端点之间穿过去,而且对于两个相邻的端点之间,光线或是都能穿过去

            ,或是被挡住,所以,只要在每两个相邻端点之间找一条光线进行判断

            即可。

            

            

            

 

具体程序实现(Java):