【寒假每日算法】—— day.1 方块分割

学习目标:

分享寒假每日刷的算法题,冲击4月蓝桥杯!!冲冲冲


原题:方块分割(2017省赛)

题目描述:

6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。如下就是三种可行的分割法。 试计算: 包括这 3 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。


題解:

思路(回溯算法):

1. 对于类似的棋盘问题想到用回溯算法解决。因为分割线一定为中心对称图形,所以只需要对分割线的一半回溯就行。以中心对称点为起点向外划线。

2. 递归的终止条件:情况1.当割线到达边界。情况2.当前点已经切割过

3.单层递归逻辑:对四个方向一一搜索,对于已经切割过的点做好标记

4.一些细节:因为切割线是中心对称图形,所以在标记的同时还要将关于中心对称的进行标记

5.注意旋转对称的属于同一种分割法,所以最终答案要整除4


 代码实现 (Python):

ans = 0
chess = [[0 for i in range(7)]for j in range(7)] #初始化方块阵
dir = [(1,0),(0,1),(-1,0),(0,-1)] #四个切割方向
def backtrack(x,y): #回溯函数
    global ans
    if chess[x][y] == 1: #情况二
        return
    if x == 0 or y == 0 or x == 6 or y == 6: #情况一
        ans += 1
        return
    for i in range(4): 
        chess[x][y] = 1 #标记当前切割点
        chess[6-x][6-y] = 1 #标记中心对称点
        backtrack(x+dir[i][0],y+dir[i][1]) #递归
        chess[x][y] = 0 #回溯,撤销标记点
        chess[6 - x][6 - y] = 0
backtrack(3,3)
print(ans//4)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄某人呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值