【N皇后问题】

【题目】
N皇后问题;在N*N的棋盘上摆放皇后,皇后不能被其他皇后吃掉。
【解】

def num1(n):
    if n<1:
        return 0
    record = [0]*n
    return process1(0,record,n)


def process1(i,record,n):
    if i == n :
        return 1
    res = 0
    for j in range(n):
        if isValid(record,i,j):
            record[i] = j
            res += process1(i+1,record,n)
    return res


def isValid(record,i,j):
    for k in range(i):
        if (j == record[k]) or (abs(record[k]-j) == abs(i-k)):
            return False
    return True

创建大小为n的列表。列表的每一项表示,在index值的行数下,皇后应该放在第几列。比如,record[0] = 1,表示在棋盘第一行第1列有一个皇后。
process1函数用来放置皇后。即,如果有合适的位置放置皇后,会递归调用process1,使行数加1。res变量用来存放有多少种方式。
isValid函数用来判断新的皇后放在此处是否合理,也就是说,如果新的皇后与上一行皇后在同一列或者在对角线上,即为False,否则为True

def conflict(state,nextX):
    nextY = len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0,nextY-i):
            return True
    return False


def Queen(num,state = ()):
    for pos in range(num):
        if not conflict(state,pos):
            if len(state) == num -1:
                yield (pos,)
            else:
                for result in Queen(num,state + (pos,)):
                    yield (pos,) + result

第二种方式同样是采用递归方法,只是最后返回的是模拟棋盘放置的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值