poj 1020 分蛋糕问题

这是一个关于poj 1020题目的解题报告,主要介绍了如何使用回溯算法解决切蛋糕问题,即判断能否通过一系列小正方形无重叠地拼接成一个大正方形。解题策略包括计数存储、按列占用数记录大正方形状态,并通过剪枝优化搜索效率。文章提供了详细的代码实现,包括剪枝策略和回溯过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 *  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值