/*
* poj 1020 切蛋糕
题目大意:
求能否将一堆小正方形无重叠的拼接成一个大正方形?
解题思路:
回溯 + 剪枝
按照从左到右,从上到下的顺序,枚举所有可以放置正方形的单元,尝试放入合适的小正方形。
直到无法放入小正方形或者完全放完为止。
1、因为小正方形的边长介于1~10之间,所以可以采用计数的方式来存储小正方形的个数。
2、采用每列占用数的方式来存储大正方形的占用情况,同时用来查找下一个可能的安置单元。
3、每次选择占用最少的列作为安置点 -- 该点必然是某个正方形的左上点,因为它的左上没有其他空置点了!
4、从大到小选择小正方形,如果最终所有小正方形可以拼成大正方形的话,所有的小正方形都会用到的,
同等的情况下选择大的,等于把更灵活、容易安排的小的放在了后面,有点贪心的感觉。但是如果
选择大的不成功,不等于整个拼接就失败了,应该选择更小的正方形进行尝试。也就是传说中的回溯。
剪枝:
1、在安置点(最少占用列)尝试放置剩余的最大正方形时,出现超出边界的情况,可以直接返回false
因为剩余空间最大的列居然都无法满足某个剩余正方形,则该正方形必然无法放下,因此无需进行
进一步的搜素
2、在安置点尝试放置某边长为a的小正方形失败,则所有后续为a的小正方形也无需尝试,直接进行
更小边长正方形的尝试!
最后:
贪心的反例:
10 8 4 4 3 3 3 3 3 3 3 1 1 1 1 1 -> 边长为10的大正方形,与2个4x4、7个3x
poj 1020 分蛋糕问题
最新推荐文章于 2022-11-09 09:35:48 发布