骚气的Python之8皇后

  1. test1:可用于实现遗传算法(还没写)
  2. test2:遍历找出所有解(92)
  3. 下面看代码

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值