问题描述:
假设有一个矩形区域,有若干条直线切割该区域,并且没有一条直线与Y轴平行,且不存在三条(以及3条以上)切割线相交于一点的情况。请问该矩形平面被分割成多少块。
分析:假设一块矩形区域已经被切割成很多块,那么此时再增加一条切割线,新的切割线与其他切割线相交,且有m个交点。那么新的切割线被分割成m+1段,每一段都会将原来的一块子区域分成两块,即总的会增加m+1块新区域。
那么假设k-1条切割线已划分了Nk-1块区域,第k条切割线与其他切割线有mk个交点,那么总的块数为Nk = Nk-1+mk+1。
这个公式显然是个动态规划问题。(思想是动态规划,自顶向下的推导)。
显然,如果利用动态规划,需要双循环,且还要去查找交点并判断交点是否在矩形区域内,那么时间复杂度为O(N2|Find&Judge|)。下面我画个程序流程图:
举例说明:
1.假设有两条相交的切割线(交点在矩形区域内)
a.遍历第一条切割线与剩下的一条切割线是否有相交且在矩形区域内。
存在:SumBlock =0+1+1 = 2
b.遍历第二条切割线与剩下的0条切割线是否有交点
不存在:SumBlock =2+0+1 = 3
c.已遍历完所有的切割线
SumBlock = 3 + 1 = 4
2.假设有三条相交的切割线(交点在矩形区域内)
a.遍历第一条切割线与剩下的两条切割线的交点
存在两个交点:SumBlock= 0+2+1 = 3
b.遍历第二条切割线与剩下的一条切割线的交点
存在一个交点:SumBlock= 3+1+1 = 5
c.遍历最后一条切割线
不存在交点:SumBlock= 5+0+1 = 6
d.遍历完成
SumBlock = 6+1 = 7
3.假设有三条相交的切割线(有两条平行)
a.遍历第一条切割线与剩下两条的交点:
存在两个:SumBlock= 0+2+1 = 3
b.遍历第二条切割线与剩下一条的交点:
不存在:SumBlock =3+0+1 = 4
c.遍历最后一条
不存在:SumBlock =4+0+1 = 5
d.遍历完成
SumBlock = 5+1 = 6
以上解题思路属于标准的动态规划,因此我做了详细的说明。书中还有一种巧妙的技巧性解法,很巧妙的同时也很简单,只是很难想到罢了。不难看懂,有兴趣的话可以再仔细研究一下:原文P51