蓝桥杯 python N皇后代码及详解(day1)

题目描述:

在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。

输入描述:

输入中有一个正整数 N≤10,表示棋盘和皇后的数量

输出描述:

为一个正整数,表示对应输入行的皇后的不同放置数量。

代码如下:

n=int (input())
x=[]
y=[]
k=0
def conflict(k):
    for i in range(k):
        if x[i]==x[k]or (k-i)==abs(x[k]-x[i]):
            return True
    return False
def queen(k):
    if k>=n:
        y.append(x[:])
    else:
        for i in range(n):
            x.append(i)
            if not conflict(k):
                queen(k+1)
            x.pop()
queen(0)
print(len(y))
print(y)

以4皇后为例,输出结果为

核心思想与详解

1、核心思想是利用回溯算法,那么什么是回溯算法呢,它是一种选优搜索法,跟数据结构中的深度优先遍历很相似,当探索到达某一步时,发现达不到目标,就要回溯到上一个节点,再去遍历其他的孩子,以此类推直到找到最优解或者满足条件的解。

2、代码的总体思路是

用回溯法去解题,想办法让你的代码与深度遍历二叉树联系起来。

首先说各个数据的含义:n表示有几个皇后;x是存放皇后位置的序列,y用来存放所有皇后位置排列。(输出len(y)就是输出几种合理的放置方法),表示当前的执行行数。

其次是自定义函数conflict的作用,因为我们题目要求不能在同一行,同一列,还有45°斜线,这个函数就是用来充当这个守卫,把不符合题意得位置去掉。

再者是自定义函数queen,在这个函数中,我们首先判断的是k和n的大小,k是当前执行行数,n是总行数,比如n等于4,当我们k走第4行(k=3)或者第5行(k=4)时,说明我们已找到正确的解,把正确的解存入y中,如果k<n,我们就开始寻找皇后的位置,大致思路是:当我们把第一个皇后放在第一行第一列,因为此时只有一个皇后,根本就不存在冲突,我们就把这个位置记录在x里,然后k+1,我们就把第2个皇后从第2行的第一列开始遍历,直到第3列没有冲突,再把这个位置记录在x里,但第3个皇后在第3行中没有一个位置是符合的,于是,我们就回溯,也就是x.pop()的作用,把我们在第2行放置的位置删去,再把皇后放在第4列,以此类推即可,直到找到正确的答案。

我被困住的点有:

1、我不知道回溯跟这个题的联系在哪,也就是不明白这个题的核心思路,误区是,我在没有明白解题的思路的情况下,我开始看代码,一直绕k是什么,i是什么,列是怎么区分的,盲目按照代码代入数据,试了无数次都不正确。

2、因为很多次的失败,我把这个问题想的很困难,认为我肯定做不出来了,但是心里还是不服输,一遍又一遍找资料,可有些资料明明说的很明朗,但我不知因为什么缘故,或许是不自信或者烦躁等等原因一直看不懂,直到今天,我想再看一次,只能一遍过,然后看到了我一直迷惑的那个点,然后其他顺其自然也就都懂了。

家人们,我花了整整两天时间才悟了,在这两天的斗争里,我无数次怀疑我的能力,我是不是很笨,我是不是就应该浪费时间在这上面去,但是我没放弃,,因为我会不甘心,我一直在寻找答案,然后就真的悟了,这一刻的喜悦真的无以言表!还有就是,一定要多复盘,知道自己的核心困难是什么,然后逐个击破,共勉!

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值