在前几天的基础上,总算是有点进度了。。。国庆期间还得留在实验室做实验的测数据>…<
好歹今天完成的比较早,就好好开始学习。
开始尝试八皇后问题
def conflict(state,nextX):
#接受既有皇后的位置,并确定下一个皇后的位置是否会导致冲突
#nextX 为下一个皇后所在的列数
nextY = len(state)
#获取下一行的行数
for i in range(nextY):
if abs(state[i] - nextX) not in (0 , nextY - i):
return True
"""
在第一行到下一行之间进行遍历,若既有的列数和下一行的列数相等或者成对角线。因为nextX是固定值,所以只要有任意一个既有的皇后与之冲突就给conflict 函数返回一个 True,来确认已经产生冲突了。
"""
return False
#若循环结束还没产生矛盾,说明既定的皇后与下一个没冲突
def queens(num,state):
if len(state) == num - 1 :
# 如果既有n-1 个皇后,就差最后一个没摆则...
for pos in range(num):
# 遍历最后一行,从第一列到最后一列
if not conflict(state,pos):
# 若不产生矛盾,则输出对应的位置 pos
yield pos
list(queens(4, (1,3,0)))
因为return的逻辑的关系卡住了,也浪费了许多时间。return是直接给调用的部分返回一个值,不考虑后续的所有循环等语句。
到这里 基本逻辑就理清楚了。两个主要的函数也定义完了。接下来要整合函数的功能。
采用递归的方式进行,对更底层的进行操作。
def queens(num,state):
if len(state) == num - 1 :
for pos in range(num):
if not conflict(state,pos):
yield pos
else:
# 如果不是最后一项
for pos in range(num):
if not conflict(state,pos):
# 如果不是最后一项
for result in queens(num, state + (pos,)):
yield (pos,) + result
简化,加上初始值后。
def queens(num = 8, state = ()): #设置默认值
for pos in range(num):
if not conflict(state , pos):
if len(state) == num -1:
yield (pos ,)
else:
for result in queens(num, state + (pos ,)):
yield (pos,) + result
### (pos, ) 中的逗号不能少,这样才是元组。
加上对输出的润色后。得到总体如下
### 检测冲突
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 queens(num = 8, state = ()): #设置默认值
for pos in range(num):
if not conflict(state , pos):
if len(state) == num -1:
yield (pos ,)
else:
for result in queens(num, state + (pos ,)):
yield (pos,) + result
### 结果输出部分
# solution 是解
def prettyprint(solution):
def line(pos , length = len(solution)):
return 'O' * (pos) + 'X'+'O' *(length - pos -1)
for pos in solution:
print(line(pos))
### 尝试输出某一个答案的图例
import random
prettyprint(random.choice(list(queens(4))))
到此才算是全部完成,中间混乱了好久的东西也在自己记录在博客的过程中不断得到润色和读懂。虽然几乎还是照搬书上的代码,但是现在逐渐的慢慢能够自己先不看代码写出一些来。
继续努力 小白
顺便问一下,为什么别人的还有各种颜色的呢。。我咋就咩有。