受伤的皇后python解法蓝桥杯

题目描述

 解题思路

在n*n大小的棋盘上放置n个皇后,且要满足3题给的三个条件从这里我们可以得出

1.使用深度优先遍历,当第1行第1列开始,以行为dfs的输入变量,依次遍历每一行的哪一列可以放皇后

2.怎么才算方案加一呢,当你遍历到第n行时,你肯定会在第n行放一个皇后,因为n*n的棋盘放n个皇后还要不同行,你最后一行肯定放一个,当dfs传进来的行数等于皇后个数说明方案数加一

具体情况看代码批注

代码

    n=int(input())
    col=[-99]*n #这个列表记录每一行的皇后在第几列,这里的初始值设置较大一点不然会影响后面的斜45度判断条件
    count=0

    def dfs(row):
        global n,col,count #声明使用这几个全局变量
        if row==n:
            count+=1#由于在n*n的棋盘放n只皇后又不重行说明到遍历到最会一行既产生一种可能

        else:
            for _col in range(n):#每列遍历所有行
                flag=True
                for _row in range(n):#col[_row]=_col表示皇后存放在了第_row行的第_col列
                    if _col==col[_row]:
                        flag=False#说明当前行的当前列
                    elif abs(row-_row)==abs(_col-col[_row]) and abs(row-_row)<3:
                        flag=False
                if flag:#说明第row行第_col列可以存放
                    col[row]=_col#标记
                    dfs(row+1)#为下一行寻找合适的列放入皇后
                    col[row]=-99#因为要回溯,就是做完了这一行的这一列要换一列。
    dfs(0)#从第0行开始
    print(count)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值