数据结构算法之python实现八皇后问题
-
所谓八皇后问题就是在一张8*8的二位数组中在该数组的每一行(每一列)都放上一个棋,最终需要在这个二维数组上面放8个棋,且这8个棋要满足任意两个棋子之间不能出现在同一行或者同一列或者同一斜线上面,最后求出有多少种摆法
-
实现的一个过程
- 首先准备一个长度为8的列表,这里我使用的是用一个列表来表示
- 过程:
- 最终的结果是打印该列表,结果有多少个就说明有多少种解法
- 假定我们要摆法的是这8个中的一个 记为n
- 当n=8(因为在列表中是以0开始的,所以n=8表示需要摆放第九个了)说明前面的8个已经都摆放好了我们就打印输出结果就行了
- 因为每一行都是从第一列开始摆法,并且需要和该行前面的所有行进行比较,看是否符合八皇后规则,如果符合我们就在这个列表记录该点存放了一个皇后
-
代码
class Queeu(): def __init__(self): self.list = [0]*8 self.count = 0 def chek(self,n): if n==8: self.output() # 调用了多少次output就说明有多少种解法 print(self.count) return for i in range(8): self.list[n] = i # 验证是否合法任意两个是否在同一行(不需要验证,因为我每次都会对n进行+1 致使他到了该行的下一行)同一列同一斜线 if self.isValid(n): self.chek(n+1) def isValid(self,n): """ 比较当前位置的皇后和他前面的皇后是否冲突i :param n: 第n个皇后 :return: 和前面比较是否冲突 """ for i in range(n): if self.list[i] == self.list[n] or abs(n-i) ==abs(self.list[n]-self.list[i]): return False else: return True def output(self): self.count +=1 for j in self.list: print(j,end=" ") print() # print(self.list) if __name__ == '__main__': queeu=Queeu() queeu.chek(0) # 例如结果有个列表[0,4,7,5,2,6,1,3] # 说明第一个皇后在1行1列 第二个皇后2行5列 第三个皇后3行8列 ..... 这就是为什么用列表来表示每个皇后摆放的位置