- test1:可用于实现遗传算法(还没写)
- test2:遍历找出所有解(92)
- 下面看代码
#encoding=utf-8
import numpy as np # 导入numpy前先安装
import sys
sys.setrecursionlimit(10000000) # 设置最大递归次数,默认为1000
arrList = [] # 存放结果
# 设置障碍,例如
# [0 0 0 0
# 0 0 1 0
# 0 0 0 0
# 0 0 0 0]
# 值为-1的位置则不能再选取
# [0 -1 -1 -1
# -1 -1 1 -1
# 0 -1 -1 -1
# -1 0 -1 0]
def setBarrier(li,i,j):
for n in range(8):
li[i][n]=-1
li[n][j]=-1
if n-i+j in range(8):
li[n][n-i+j]=-1
if -n+i+j in range(8):
li[n][-n+i+j]=-1
li[i][j]=1
# 获得第 row 行可以选取的位置,值为0可选取,返回类型为list
def getPath(li,row):
itemPath = []
for col,item in enumerate(li[row]):
if item == 0:
itemPath.append(col)
return itemPath
# 随机数
def ri(n):
return np.random.randint(n)
# 随机选1个
def selectOne(arr,row):
itemPath = getPath(arr,row)
if itemPath == []:
return False
rand = ri(len(itemPath))
col = itemPath[rand]
arr[row][col]=1
setBarrier(arr,row,col)
print arr
return True
# test1 随机产生结果
def test1():
prime = np.zeros([8,8])
arr = prime.copy()
for i in range(8):
print i
if selectOne(arr,i)==False:
print "false:\n",arr
return
if i == 7:
arr[arr<1]=0
print "ok:\n"
print "result:\n",arr
# 递归遍历所有解
def calc(arr,row):
sum = 0
# 有解
if row >= 8:
arr[arr<1]=0
arrList.append(arr)
return 1
# 无解
if getPath(arr,row)==[]:
return 0
for col in getPath(arr,row):
_arr = arr.copy()
_arr[row][col]=1
setBarrier(_arr,row,col)
sum += calc(_arr,row+1)
return sum
# test2 遍历产生结果
def test2():
prime = np.zeros([8,8])
arr = prime.copy()
print calc(arr,0)
return arrList
# 入口
def main():
# test1()
test2()
if __name__=="__main__":
main()
4.运行结果:92