小白 Python求学之路

在前几天的基础上,总算是有点进度了。。。国庆期间还得留在实验室做实验的测数据>…<

好歹今天完成的比较早,就好好开始学习。
开始尝试八皇后问题

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))))

到此才算是全部完成,中间混乱了好久的东西也在自己记录在博客的过程中不断得到润色和读懂。虽然几乎还是照搬书上的代码,但是现在逐渐的慢慢能够自己先不看代码写出一些来。
继续努力 小白

顺便问一下,为什么别人的还有各种颜色的呢。。我咋就咩有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值