Eight queens经典回溯算法

本秂侑毒 提交于 2019-12-11 14:39:49
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)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!