题目描述

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

小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。

小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。

小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。

下图给出了两种方案:

七巧板拼图 蝴蝶python_七巧板拼图 蝴蝶python

请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。

解答:我的想法是分两部分来写,第一部分遍历所有点作为玩具蛇的头部,然后带入第二部分函数体里,第二部分将每一步的方向均分为上下左右,然后确定终止条件: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)                #输出所有的方案数

七巧板拼图 蝴蝶python_回归算法_02