方格填数
这个题在上一篇文章中用的暴力枚举把题做出来的,但并不是最好的解决方法,所以这次我们用深度优先搜索算法来解决。
深度优先搜索
深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
举例:
深度优先搜索,是先看1,然后1可以到2,然后直接看2,2可以到3,5随便选一个都可以,我们到3好了,然后看3的那行可以到1,2,4,5,6随便选一个都可以,不过要去掉重复的,以此类推。可以排出很多种的。
如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
import numpy as np
import math
def permutation(lst):
if len(lst)==0 or len(lst)==1:
return [lst]
result=[]
for i in lst:
temp_list=lst[:] #表示从头到尾输出,实际上复制出了一个新的list
temp_list.remove(i) #删除第一个出现的指定数据
temp=permutation(temp_list)
for j in temp:
j.insert(0,i) #在指定的位置插入数据
result.append(j)
return result
if __name__=="__main__":
lst=[0,1,2,3,4,5,6,7,8,9]
sum = 0
temp_result=permutation(lst) #统计所有全排列
map = np.zeros((4,5))
for i in range(4):
map[i][4]=1000
for i in range(5):
map[3][i]=1000
map[0][0]=1000
map[2][3]=1000
for lis in temp_result:
k = 0
for t in range(1,11): #填数字
map[t//4][t%4]=lis[t-1]
for i in range(3): #判断是否符合要求
for j in range(4):
if(math.fabs(map[i][j]-map[i][j+1]) ==1 or
math.fabs(map[i][j]-map[i+1][j]) ==1 or
math.fabs(map[i][j]-map[i+1][j-1]) ==1 or
math.fabs(map[i][j]-map[i+1][j+1]) ==1):
k=1;
break
if k != 1:
sum=sum + 1 #统计符合要求的排列
print('sum=',sum)
运行结果截图: