最近在学Python,书中关于八皇后问题的递归解很巧妙,但我一直在想能否不用递归而是用循环,主要卡在两点,一是如何不用递归而给出任意规格棋盘上落子的所有可能,二是如何验算这些可能。
第一个问题是将整个棋盘上的棋子位置视作n进制下对应位置上的数字
以4*4棋盘为例
当棋子摆放位置为【1,0,0,0】时,可以将其视为一个4进制数“1000”,换算成10进制数就是64
当棋子摆放位置为【1,0,1,0】时,可以将其视为一个4进制数“1010”,换算成10进制数就是68
通过上述过程可以将棋子的每一种摆放可能与从0开始到10进制摆法总数的每一个数绑定。摆法总数易得,通过进制换算就可以还原成棋子位置。比如255通过4进制除法还原成【3,3,3,3】,1通过4进制除法还原成【0,0,0,1】等。
第二个问题用了两个for循环,检测行差和列差的关系,不知道大佬们怎么解决的。。。
def Conflict(list): for i in range(len(list)-1): start=i+1 end=len(list) for x in range(start,end):# 此函数实现从起始位置(动态的起始位置) 开始向后直到结尾的遍历 if (x-i)==abs(list[x]-list[i]):#两个元素如果行差=列差,则必错 return else: pass print(list) return list def Calculate(n): counter=0 List=[] while counter<(n**n): list=[] x=counter for i in range(n): #将棋盘中每行元素的列位置看做n进制下对应位置上的数字 t=x%n list.append(t) x=x//n list.reverse() set_list = set(list) if len(set_list) == len(list):#初步筛选如果有不同行处于一列,则无调用意义 y=Conflict(list) if y: List.append(y) else: pass counter+=1 print(List) print(len(List)) Calculate(8)#正确性经过验证