算法题目1——闭合篱笆

 题目:

 

 

 

 

解答思路:

(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):

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值