Eight queens经典回溯算法

def conflict(state, nextX):
    print('state:',state)
    nextY = len(state)

    for i in range(nextY):
        print("i=",i)

        if abs(state[i]-nextX) in (0, nextY-i):
            print('confict')
            return True
    return False

def queens(num=8, state=()):
    for position in range(num):
        print('***')
        print('pos:',position)
        
        if not conflict(state, position):
            if len(state) == num-1:
                print('back to 1st_space_____________position:',position)
                yield (position,)
            else:
                print('Into 2nd_space__________recursive')
            
                for result in queens(num, state + (position,)):
                    print('membersihip position:',position)
                    print('membership result:',result)
                    yield (position,) + result
        else:
            print('branch end')
            pass

重点是recursive的理解,可以采用多重空间理解法,在第二重空间循环完毕后,别忘了回溯至第一重空间继续运行。因为,第二重函数是第一重函数递归迭代进去的。

>>>print(next(queens(4,(1,3,0))))

***
pos: 0
state: (1, 3, 0)
i= 0
i= 1
i= 2
confict
branch end
***
pos: 1
state: (1, 3, 0)
i= 0
confict
branch end
***
pos: 2
state: (1, 3, 0)
i= 0
i= 1
i= 2
back to 1st_space_____________position: 2
(2,)

>>>print(next(queens(4,(1,3))))

pos: 0
state: (1, 3)
i= 0
i= 1
Into 2nd_space__________recursive
***
pos: 0
state: (1, 3, 0)
i= 0
i= 1
i= 2
confict
branch end
***
pos: 1
state: (1, 3, 0)
i= 0
confict
branch end
***
pos: 2
state: (1, 3, 0)
i= 0
i= 1
i= 2
back to 1st_space_____________position: 2
membersihip position: 0
membership result: (2,)
(0, 2)

>>>print(next(queens(5)))

***
pos: 0
state: ()
Into 2nd_space__________recursive
***
pos: 0
state: (0,)
i= 0
confict
branch end
***
pos: 1
state: (0,)
i= 0
confict
branch end
***
pos: 2
state: (0,)
i= 0
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2)
i= 0
confict
branch end
***
pos: 1
state: (0, 2)
i= 0
i= 1
confict
branch end
***
pos: 2
state: (0, 2)
i= 0
confict
branch end
***
pos: 3
state: (0, 2)
i= 0
i= 1
confict
branch end
***
pos: 4
state: (0, 2)
i= 0
i= 1
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2, 4)
i= 0
confict
branch end
***
pos: 1
state: (0, 2, 4)
i= 0
i= 1
i= 2
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2, 4, 1)
i= 0
confict
branch end
***
pos: 1
state: (0, 2, 4, 1)
i= 0
i= 1
i= 2
i= 3
confict
branch end
***
pos: 2
state: (0, 2, 4, 1)
i= 0
i= 1
confict
branch end
***
pos: 3
state: (0, 2, 4, 1)
i= 0
i= 1
i= 2
i= 3
back to 1st_space_____________position: 3
membersihip position: 1
membership result: (3,)
membersihip position: 4
membership result: (1, 3)
membersihip position: 2
membership result: (4, 1, 3)
membersihip position: 0
membership result: (2, 4, 1, 3)
(0, 2, 4, 1, 3)

更多数学原理小文请关注公众号:未名方略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞行codes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值