一、题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
如下就是三种可行的分割法。
试计算: 包括这 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)#旋转对称属于一种方法