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

部署运行你感兴趣的模型镜像

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

题目描述

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

历史上,人们花了很久才找到了若干完美正方形。比如:如下边长的 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):
    map[i][j]=1
for i in range(61):
  for j in range(93,154):
    map[i][j]=1
square_nums=0
nums=[2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50,52]
numbers=[]
#获取最低处起始地点
def con():
  global map
  a=0
  b=0
  for i in range(len(map)):
    t=True
    for j in range(len(map[i])):
      if map[i][j]==0:
        a=i
        b=j
        t=False
        break
    if not t:
      break
  return a,b

def tian(a,b):
  global map,nums,square_nums
  for i in range(len(nums)):
    if a+nums[i]<=154 and b+nums[i]<=154:
      for m in range(a,a+nums[i]):
        for n in range(b,b+nums[i]):
          if map[m][n]==1:
            return 0
      for m in range(a,a+nums[i]):
        for n in range(b,b+nums[i]):
          map[m][n]=1
      temp=nums[i]
      numbers.append(nums[i])
      square_nums+=1
      temp_nums=square_nums
      del nums[i]
      p,q=con()
      if p==0 and q==0:
        print(numbers)
        number_sum=0
        d=-1
        ammm=[]
        while number_sum<154:
          number_sum+=numbers[d]
          ammm.insert(0,numbers[d])
          if 154-number_sum in numbers:
              ammm.insert(0,154-number_sum)
              break
          d-=1
        print(ammm)
      elif square_nums==20:
        return
      tian(p,q)
      del numbers[temp_nums-1]
      square_nums-=1
      nums.append(temp)
      nums.sort()
      for m in range(a,a+temp):
        for n in range(b,b+temp):
          map[m][n]=0


a,b=con()
tian(a,b)

.
有好的思路也可以留在评论区哦,编码不易,有帮助的话点个赞支持一下吧~~~

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值