Python 蓝桥杯 方格分隔

一、题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。

如下就是三种可行的分割法。

21ebc0598d5f4ce40e8a98eff4058a4d.png (360×352)adece25d26c80ac66d45d5210e508d1f.png (360×352)afd7b2797aaca09ffc67db6f60401753.png (360×352)

试计算: 包括这 3 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

 二、解题思路

分隔的两部分图像要形状一样,显然都要经过中间点,并且旋转堆成属于同一种分割法,那么最后得到的结果需要除以4。

一样的,深度遍历的流程,先定义分隔的四个方向.接着定义函数。if语句判断设置退出条件,本题遍历结束就是当遍历到边界时,另外还可以设置if进行剪枝,对于不满足条件的值进行跳过。

设置一个二维数组visied标记该点是否走过,如果值为0表示没有遍历过,该点可走。如果值为1表示该点已经走过,别忘了最后还要将该点令为0进行回溯。

因为是关于中心点(3,3)对称,所以我们不仅需要标记一个点,还要标记其关于点(3,3)对称的点。

三、代码

#move=[(0,+1),(-1,0),(0,-1),(-1,0)]
move= [(-1, 0), (1, 0), (0, -1), (0, 1)]
visied=[[0 for i in range(7)]for i in range(7)]

count=0
def dfs(x,y):
    global count,visied
    #遍历到边界时停止
    if x==0 or x==6 or y==0 or y==6:
        count+=1
        return
    visied[x][y]=1
    visied[6-x][6-y]=1
    #对四个方向进行遍历
    for i in range(4):
        x_new=x+move[i][0]
        y_new=y+move[i][1]
        #剪枝,如果不满足条件跳过
        if x_new>6 or x_new<0 or y_new>6 or y_new<0:
            continue
        if visied[x_new][y_new]==0:
            dfs(x_new,y_new)
            visied[x_new][y_new]=0
            visied[6-x_new][6-y_new]=0

dfs(3,3)
print(count//4)#旋转对称属于一种方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值