蓝桥杯|蓝桥python——玩具蛇

试题 E: 玩具蛇 本题总分:15 分
【问题描述】
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一
个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着
字母 A 到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将
玩具蛇放进去。
下图给出了两种方案:
蓝桥杯|蓝桥python——玩具蛇
文章图片

【蓝桥杯|蓝桥python——玩具蛇】请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩
具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分!
蓝桥杯|蓝桥python——玩具蛇
文章图片
以上是我的思路,然后关于DFS的话递归过程有几个变量,就设几个参数
代码如下

def dfs(i,j,step): global count,isVisited if step>16:#大于16,则剪枝 return if step==16 :#若刚好等于16,则找到一种方案 count+=1 return for k in range(4):#生成(i,j)所有邻居 ii=i+d[k][0] jj=j+d[k][1] if ii>=0 and ii<=3 and jj>=0 and jj<=3 and isVisited[ii][jj]==False:#如符合条件且未被访问 isVisited[ii][jj]=True dfs(ii,jj,step+1) isVisited[ii][jj]=False#回溯:作用是一个点可由多个父节点count=0 d=[(-1,0),(1,0),(0,1),(0,-1)]#四个方向 for i in range(4): for j in range(4):#其中(i,j)指玩具蛇头即1所在的位置 isVisited=[[False for _ in range(4)] for _ in range(4) ]#将所有点都置为未访问 isVisited[i][j]=True#蛇头1已访问 dfs(i,j,1)print(count)

答案:552

    推荐阅读