学习目标:
分享寒假每日刷的算法题,冲击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)