题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
解答:我的想法是分两部分来写,第一部分遍历所有点作为玩具蛇的头部,然后带入第二部分函数体里,第二部分将每一步的方向均分为上下左右,然后确定终止条件:1是十六个点全部走遍,方案数加一,返回上一级;2是走的次数超过16个点,确定此时已经错误,返回上一级。然后输出所有的方案数即可。
def dfs(i,j,temp):
global count,ans #全局变量,count方案数会一直累加
if temp > 16: #行走的步数超过16,即代表该方案不能通过,返回即可,一般情况下不会出现,即进行容错处理
return
if temp == 16: #行走的步数为16,符合条件,方案数加一,返回上一级
count+=1
return
for x in range(4): #此时节点的上下左右4个方向放置
i_1 = i + dd[x][0]
j_1 = j + dd[x][1]
if i_1>=0 and i_1<=3 and j_1>=0 and j_1<=3 and ans[i_1][j_1]==0:
#如果下标没有越界且该节点尚未走过,则走该节点
ans[i_1][j_1]=1
dfs(i_1,j_1,temp+1)
ans[i_1][j_1]=0
count = 0
dd = [[0,1],[0,-1],[1,0],[-1,0]] #上下左右行走的数组
for i in range(4):
for j in range(4):
ans = [[0 for x in range(4)] for y in range(4)] #此时是把整个区间全部设为空值
ans[i][j] = 1 #把头节点标记为已走过,0表示没有走过,1表示走过
dfs(i,j,1) #带入循环,遍历此时头节点所在位置的情况下所有符合条件的方案
print(count) #输出所有的方案数