完美正方形---蓝桥杯练习

写了两个小时终于做出来了,呜呜呜呜,是我太菜

题目描述

如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。

历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的 22 个正方形 2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 50 60。

如下图那样组合,就是一种解法。
在这里插入图片描述
此时,紧贴上边沿的是:60 50,紧贴下边沿的是:26\ 28\ 17\ 21\ 1826 28 17 21 18。

22 阶完美正方形一共有 88 种。下面的组合是另一种:2 5 9 11 16 17 19 21 22 24 26 30 31 33 35 36 41 46 47 50 52 61。

如果告诉你该方案紧贴着上边沿的是从左到右依次为:47 46 61,你能计算出紧贴着下边沿的是哪几个正方形吗?

思路

刚拿到题就很懵啊,虽然知道肯定是DFS,可是竟然有点无从下手。后来在看到一些大佬的思路后,我确定了一种我能理解并容易实现的思路。

我们都玩过俄罗斯方块(没玩过当我没说),我们在选择一块方块的位置时都是选择尽量往底处放置

那么我们可以创建一个154X154的二维数组,通过0和1确定当前位置是否已被占用,然后每次从最底处开始下一层的搜索。放置方块前要判断当前位置是否放得下,最后确定一个递归出口,当所有方块用完时结束,如果结束时二维数组中的元素全是1,那么就是正确答案了

代码(写的比较乱,我还不是特别熟练)

import os
import sys

# 请在此输入您的代码
map=[[0 for i in range(154)]for j in range(154)]
for i in range(47):
  for j in range(47):
    map[i][j]=1
for i in range(46):
  for j in range(47,93):
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值