1.题目描述:点击打开链接
2.解题思路:本题利用暴力搜索解决。一开始我的思路有点问题,想着先把所有方格给标记出来,然后从面积最小的方格开始,一个一个画,最后判断是否和原来相等。但这样带来的问题是有的正方形的摆放位置有多种可能,无法判断具体是哪一种。因此只画一次就判断结果肯定是片面的。所以最终否定了这种做法。接下来想着能否根据正方形露出来的个数来分情况讨论是否合法。如果遇见非法情况就输出No。不过最后发现又是考虑不周,比如正方形只露出来左上角和右下角这种情况就没有考虑在内,加上合法情况和非法情况都比较多,这种方法也宣告失败。
其实,正确的做法应该是枚举所有可能的摆放方式,但如何来枚举是一个问题。首先,可以将输入的轮廓转化为01序列,遇到边界符号就是1,空格就是0。这样只需要看枚举的重叠方式的效果和输入的效果是否完全相同即可。
那么正方形该如何枚举呢?通过观察我们发现,所有可能的摆放位置一共就9种情况,因此可以把每个正方形事先存储好。那么问题又来了,怎么完整的描述一个正方形呢?通过观察我们还可以发现,8个边界的下标和中间4个空格的下标即可完整的描述一个正方形。而且这样描述会让模拟重叠这个过程变得十分的方便。只要遇到这个正方形的边界下标,就设为1,只要遇到该正方形的空格,就设为0,同时累加边界的个数。当边界相同时,再检查模拟后的结果和输入的是否完全一致即可。